diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml new file mode 100644 index 00000000000..4225c413d1e --- /dev/null +++ b/.github/workflows/dart.yml @@ -0,0 +1,67 @@ +name: Dart code + +on: + push: + branches: + - main + paths: + - '**/*.dart' + - '**/pubspec.yaml' + - '**/pubspec.lock' + - '**/analysis_options.yaml' + - 'packages/**' + - 'tool/dash_site/**' + - '.github/workflows/dart.yml' + pull_request: + branches: + - main + paths: + - '**/*.dart' + - '**/pubspec.yaml' + - '**/pubspec.lock' + - '**/analysis_options.yaml' + - 'packages/**' + - 'tool/dash_site/**' + - '.github/workflows/dart.yml' + schedule: + - cron: "0 0 * * 0" + +permissions: read-all + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +jobs: + test: + name: Analyze and test Dart (${{ matrix.name }}) + runs-on: ubuntu-latest + if: github.repository == 'flutter/website' + strategy: + fail-fast: false + matrix: + include: + - name: "Beta channel" + branch: beta + experimental: false + - name: "Stable channel" + branch: stable + experimental: true + continue-on-error: ${{ matrix.experimental }} + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + - uses: subosito/flutter-action@e938fdf56512cc96ef2f93601a5a40bde3801046 + with: + channel: ${{ matrix.branch }} + - name: Fetch Dart dependencies + run: dart pub get + continue-on-error: ${{ matrix.experimental }} + - name: Check Dart code formatting + run: dart run dash_site format-dart --check + continue-on-error: ${{ matrix.experimental }} + - name: Analyze Dart code + run: dart run dash_site analyze-dart + continue-on-error: ${{ matrix.experimental }} + - name: Run Dart tests + run: dart run dash_site test-dart + continue-on-error: ${{ matrix.experimental }} diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 00000000000..a6dc8e5e4b1 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,89 @@ +name: Docs site + +on: + push: + branches: + - main + paths: + - 'sites/docs/**' + - 'examples/**' + - 'packages/excerpter/**' + - 'firebase.json' + - 'tool/dash_site/**' + - 'tool/config/linkcheck-skip-list.txt' + - 'pubspec.yaml' + - 'pubspec.lock' + - 'analysis_options.yaml' + - '.github/workflows/docs.yml' + pull_request: + branches: + - main + paths: + - 'sites/docs/**' + - 'examples/**' + - 'packages/excerpter/**' + - 'firebase.json' + - 'tool/dash_site/**' + - 'tool/config/linkcheck-skip-list.txt' + - 'pubspec.yaml' + - 'pubspec.lock' + - 'analysis_options.yaml' + - '.github/workflows/docs.yml' + schedule: + - cron: "0 0 * * 0" + +permissions: read-all + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +jobs: + excerpts: + name: Check code excerpts + runs-on: ubuntu-latest + if: github.repository == 'flutter/website' + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + - uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260 + with: + sdk: beta + - name: Fetch Dart dependencies + run: dart pub get + - name: Check if excerpts are up to date + run: dart run dash_site --site=docs refresh-excerpts --fail-on-update --dry-run + + linkcheck: + name: Build and check links + runs-on: ubuntu-latest + if: github.repository == 'flutter/website' + timeout-minutes: 30 + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + - uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260 + with: + sdk: beta + - name: Fetch Dart dependencies + run: dart pub get + - name: Install firebase-tools + run: curl -sL https://firebase.tools | bash + - name: Build site + run: dart run dash_site --site=docs build + - name: Check for broken Markdown link references + run: dart run dash_site --site=docs check-link-references + - name: Check for broken internal links + run: dart run dash_site --site=docs check-links + + firebase-validate: + name: Validate Firebase configuration + runs-on: ubuntu-latest + if: github.repository == 'flutter/website' + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + - uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260 + with: + sdk: beta + - name: Fetch Dart dependencies + run: dart pub get + - name: Validate the firebase.json file + run: dart run dash_site --site=docs verify-firebase-json diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index b05ef255858..00000000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,97 +0,0 @@ -name: test - -on: - push: - branches: - - main - pull_request: - branches: - - main - schedule: - - cron: "0 0 * * 0" - -# Declare default permissions as read only. -permissions: read-all - -jobs: - test: - name: Analyze and test code examples - runs-on: ubuntu-latest - if: github.repository == 'flutter/website' - strategy: - fail-fast: false - matrix: - include: - - name: "Beta channel" - branch: beta - experimental: false - - name: "Stable channel" - branch: stable - experimental: true - continue-on-error: ${{ matrix.experimental }} - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - - uses: subosito/flutter-action@e938fdf56512cc96ef2f93601a5a40bde3801046 - with: - channel: ${{ matrix.branch }} - - name: Fetch Dart dependencies - run: dart pub get - continue-on-error: ${{ matrix.experimental }} - - name: Check Dart code formatting - run: dart run dash_site format-dart --check - continue-on-error: ${{ matrix.experimental }} - - name: Analyze Dart code - run: dart run dash_site analyze-dart - continue-on-error: ${{ matrix.experimental }} - - name: Run Dart tests - run: dart run dash_site test-dart - continue-on-error: ${{ matrix.experimental }} - - excerpts: - name: Check if code excerpts are up to date - runs-on: ubuntu-latest - if: github.repository == 'flutter/website' - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - - uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260 - with: - sdk: beta - - name: Fetch Dart dependencies - run: dart pub get - - name: Check if excerpts are up to date - run: dart run dash_site refresh-excerpts --fail-on-update --dry-run - continue-on-error: ${{ matrix.experimental }} - - linkcheck: - name: Build site and check links - runs-on: ubuntu-latest - timeout-minutes: 30 - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - - uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260 - with: - sdk: beta - - name: Fetch Dart dependencies - run: dart pub get - - name: Install firebase-tools - run: curl -sL https://firebase.tools | bash - - name: Build site - run: dart run dash_site build - - name: Check for broken Markdown link references - run: dart run dash_site check-link-references - - name: Check for broken internal links - run: dart run dash_site check-links - - firebase-validate: - name: Validate Firebase configuration - runs-on: ubuntu-latest - if: github.repository == 'flutter/website' - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - - uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260 - with: - sdk: beta - - name: Fetch Dart dependencies - run: dart pub get - - name: Validate the firebase.json file - run: dart run dash_site verify-firebase-json \ No newline at end of file diff --git a/.github/workflows/www.yml b/.github/workflows/www.yml new file mode 100644 index 00000000000..4fe42335ebe --- /dev/null +++ b/.github/workflows/www.yml @@ -0,0 +1,69 @@ +name: Marketing site + +on: + push: + branches: + - main + paths: + - 'sites/www/**' + - 'tool/dash_site/**' + - 'tool/config/linkcheck-skip-list.txt' + - 'pubspec.yaml' + - 'pubspec.lock' + - 'analysis_options.yaml' + - '.github/workflows/www.yml' + pull_request: + branches: + - main + paths: + - 'sites/www/**' + - 'tool/dash_site/**' + - 'tool/config/linkcheck-skip-list.txt' + - 'pubspec.yaml' + - 'pubspec.lock' + - 'analysis_options.yaml' + - '.github/workflows/www.yml' + schedule: + - cron: "0 0 * * 0" + +permissions: read-all + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +jobs: + linkcheck: + name: Build and check links + runs-on: ubuntu-latest + if: github.repository == 'flutter/website' + timeout-minutes: 30 + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + - uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260 + with: + sdk: beta + - name: Fetch Dart dependencies + run: dart pub get + - name: Install firebase-tools + run: curl -sL https://firebase.tools | bash + - name: Build site + run: dart run dash_site --site=www build + - name: Check for broken Markdown link references + run: dart run dash_site --site=www check-link-references + - name: Check for broken internal links + run: dart run dash_site --site=www check-links + + firebase-validate: + name: Validate Firebase configuration + runs-on: ubuntu-latest + if: github.repository == 'flutter/website' + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + - uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260 + with: + sdk: beta + - name: Fetch Dart dependencies + run: dart pub get + - name: Validate the firebase.json file + run: dart run dash_site --site=www verify-firebase-json diff --git a/AGENTS.md b/AGENTS.md index 9b8a7148cb8..62929dde037 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -7,14 +7,20 @@ content and code in this repository. ## Project overview This repository contains the source code and content for -the Flutter framework's documentation website. -It is hosted at `docs.flutter.dev` and shouldn't be confused with -the marketing site at `flutter.dev` or the API docs at `api.flutter.dev`. +the Flutter framework's documentation and marketing websites: -The website is statically built and implemented with +- `docs.flutter.dev`: + The Flutter framework's documentation website. +- `flutter.dev`: + Flutter's homepage and marketing website. + +The API docs at `api.flutter.dev` are embedded in the Flutter SDK source +and are maintained in the repository. + +The websites are statically built and implemented with Dart and the [Jaspr](https://jaspr.site) web framework. -For loading content, data, and some of its assets, -it uses [Jaspr Content](https://docs.jaspr.site/content). +For loading content, data, and some assets, +they use [Jaspr Content](https://docs.jaspr.site/content). ### Directory structure @@ -30,15 +36,24 @@ it uses [Jaspr Content](https://docs.jaspr.site/content). for the sidenav, glossary, and various indices. - `sites/docs/src/_includes/`: Liquid partial files written in Markdown. + - `sites/www/`: + The implementation of flutter.dev, + written in Dart using Jaspr and Jaspr Content. + - `sites/www/content/`: + Markdown-based marketing pages and structured content. + - `sites/www/lib/`: + Dart source code for the site. + - `sites/www/firebase.json`: + Firebase Hosting configuration for flutter.dev. - `examples/`: A pub workspace containing Dart and Flutter code examples, - referenced by code excerpts in the Markdown files. + referenced by code excerpts in the docs Markdown files. - `tool/dash_site/`: CLI tool for site development and maintenance. ## Common commands -While working on the site, +While working on these sites, you might need to run these commands: ```bash @@ -46,13 +61,15 @@ you might need to run these commands: dart pub get # Serve a dev server of the site locally: -dart run dash_site serve +dart run dash_site --site=docs serve +dart run dash_site --site=www serve # Build a production version of the site: -dart run dash_site build +dart run dash_site --site=docs build +dart run dash_site --site=www build -# Sync code excerpts to Markdown files: -dart run dash_site refresh-excerpts +# Sync docs code excerpts to Markdown files: +dart run dash_site --site=docs refresh-excerpts # Learn what other commands are available: dart run dash_site --help diff --git a/README.md b/README.md index a2fff356a43..28f621a2567 100644 --- a/README.md +++ b/README.md @@ -148,9 +148,8 @@ following the instructions in [Get the prerequisites](#get-the-prerequisites). This command generates and serves the site on a local port that's printed to your terminal. -5. View your changes in the browser by navigating to . - - Note the port might be different if `8080` is taken. +5. View your changes in the browser by navigating to + the local URL printed to your terminal. 6. Make your changes to the local repo. diff --git a/cloud_build/deploy.yaml b/cloud_build/deploy.yaml index 6cc3207a5d2..f78372b974f 100644 --- a/cloud_build/deploy.yaml +++ b/cloud_build/deploy.yaml @@ -1,17 +1,16 @@ +substitutions: + _SITE: docs steps: - name: gcr.io/cloud-builders/git args: ['fetch', '--unshallow'] - name: gcr.io/flutter-dev-230821/firebase-ghcli - # Build the site, then deploy it to production. + # Build the selected site, then deploy it to production. entrypoint: '/bin/bash' args: - '-c' - |- - set -e - + set -euo pipefail dart pub get - dart run dash_site build --release - - firebase deploy --project=flutter-docs-prod --only=hosting + dart run dash_site --site="$_SITE" deploy options: logging: CLOUD_LOGGING_ONLY diff --git a/cloud_build/firebase-ghcli/Dockerfile b/cloud_build/firebase-ghcli/Dockerfile index 996d730b671..1f4dd54df91 100644 --- a/cloud_build/firebase-ghcli/Dockerfile +++ b/cloud_build/firebase-ghcli/Dockerfile @@ -1,11 +1,6 @@ FROM dart:3.12.0-327.4.beta@sha256:5306c1008b585f0fbcf23aa0d7145b8f65cd7bd8c63dce4b8038684c11c79833 -RUN apt-get update && apt-get install -y --no-install-recommends curl gpg ca-certificates \ - # Install the GitHub CLI. \ - && curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | gpg --dearmor -o /usr/share/keyrings/githubcli-archive-keyring.gpg \ - && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list > /dev/null \ - && apt-get update \ - && apt-get install -y --no-install-recommends gh \ +RUN apt-get update && apt-get install -y --no-install-recommends curl ca-certificates \ # Install the latest version of firebase-tools globally. \ && curl -sL https://firebase.tools | bash \ # Clean up unnecessary remnants after dependency installation. \ diff --git a/cloud_build/firebase-ghcli/README.md b/cloud_build/firebase-ghcli/README.md index b02ec4669f9..b53c0a78492 100644 --- a/cloud_build/firebase-ghcli/README.md +++ b/cloud_build/firebase-ghcli/README.md @@ -1,7 +1,7 @@ # Site deployment image This directory contains a Dockerfile that provides access to -Dart, Firebase CLI tools, and the GitHub CLI. +Dart and Firebase CLI tools. This image is used to deploy various Dart/Flutter websites to Firebase in both production and staging and to comment staged site links on GitHub PRs. @@ -9,7 +9,6 @@ to comment staged site links on GitHub PRs. ## Installed tools * Dart SDK Beta -* GitHub CLI * Firebase Tools ## Updating image diff --git a/cloud_build/scripts/stage_site_and_comment_on_github.sh b/cloud_build/scripts/stage_site_and_comment_on_github.sh deleted file mode 100755 index 55be4263d07..00000000000 --- a/cloud_build/scripts/stage_site_and_comment_on_github.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash -set -e - -deploy_to_firebase_staging_channel () { - echo "Deploying website to a staging channel on firebase..." - - # Deploy to firebase, but save the output to a variable so we can grep the - # url from the output and save it to FIREBASE_STAGING_URL for future use. - FIREBASE_DEPLOY_RESPONSE=$(firebase hosting:channel:deploy --expires 7d pr$PR_NUMBER-$HEAD_BRANCH --project=$PROJECT_ID) - echo "$FIREBASE_DEPLOY_RESPONSE" - FIREBASE_STAGING_URL=$(grep -Eo "https://$PROJECT_ID--[a-zA-Z0-9./?=_%:-]*" <<< "$FIREBASE_DEPLOY_RESPONSE") -} - -login_to_github() { - echo "Logging into github under bot account..." - - echo $GH_PAT_TOKEN > token - gh auth login --with-token < token -} - -comment_staging_url_on_github () { - echo "Commenting staging url on the PR..." - COMMENT_BODY=$(echo -e "Visit the preview URL for this PR (updated for commit $COMMIT_SHA):\n\n$FIREBASE_STAGING_URL") - - # The github CLI throws an error if --edit-last doesn't find a previous - # comment, so this edits the last comment, but if it doesn't exist, - # leave a new comment. - gh pr comment $PR_NUMBER --edit-last --body "$COMMENT_BODY" --repo $REPO_FULL_NAME || \ - gh pr comment $PR_NUMBER --body "$COMMENT_BODY" --repo $REPO_FULL_NAME -} - -deploy_to_firebase_staging_channel -login_to_github -comment_staging_url_on_github diff --git a/cloud_build/stage.yaml b/cloud_build/stage.yaml index ffd70b9542b..a82ad7e8460 100644 --- a/cloud_build/stage.yaml +++ b/cloud_build/stage.yaml @@ -1,26 +1,23 @@ +substitutions: + _SITE: docs steps: - name: gcr.io/flutter-dev-230821/firebase-ghcli - # Build the site, deploy it to staging, then comment the link on the PR. + # Build the selected site, deploy it to staging, then comment the preview link. entrypoint: '/bin/bash' args: - '-c' - |- - set -e - + set -euo pipefail dart pub get - dart run dash_site build - - cloud_build/scripts/stage_site_and_comment_on_github.sh + dart run dash_site --site="$_SITE" stage-preview \ + --pr-number "$_PR_NUMBER" \ + --repo "$REPO_FULL_NAME" \ + --commit-sha "$COMMIT_SHA" \ + --head-branch "$_HEAD_BRANCH" secretEnv: ['GH_PAT_TOKEN'] - env: - - 'PR_NUMBER=$_PR_NUMBER' - - 'HEAD_BRANCH=$_HEAD_BRANCH' - - 'PROJECT_ID=$PROJECT_ID' - - 'COMMIT_SHA=$COMMIT_SHA' - - 'REPO_FULL_NAME=$REPO_FULL_NAME' availableSecrets: secretManager: - - versionName: projects/$PROJECT_ID/secrets/flutter-website-bot-comment-pat/versions/latest + - versionName: projects/flutter-docs-prod/secrets/flutter-website-bot-comment-pat/versions/latest env: 'GH_PAT_TOKEN' timeout: 1200s options: diff --git a/pubspec.yaml b/pubspec.yaml index 22ccee33cb9..4db32b9fdf4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -10,4 +10,5 @@ workspace: - packages/analysis_defaults - packages/excerpter - sites/docs + - sites/www - tool/dash_site diff --git a/sites/www/.agents/rules/jaspr.md b/sites/www/.agents/rules/jaspr.md new file mode 100644 index 00000000000..0ff9bcb9bde --- /dev/null +++ b/sites/www/.agents/rules/jaspr.md @@ -0,0 +1,117 @@ +--- +trigger: always_on +--- + +# Jaspr Project Rules + +## Core Principles +- **Framework**: Use [Jaspr](https://github.com/schultek/jaspr) for all web UI components. Do not use standard Flutter widgets (Container, Column, Row, etc.). +- **Elements**: Use HTML-like components provided by Jaspr (`div`, `section`, `h1`, `p`, `img`, `a`, `button`, `span`, etc.). + +## Components +- **Stateless vs Stateful**: + - Use `StatelessComponent` for purely presentational components that do not manage local state. + - Use `StatefulComponent` only when internal state management (e.g., animations, form input handling) is required. +- **Client-Side Rendering**: Annotate components with `@client` if they require browser-specific APIs or interactivity that cannot be server-side rendered (SSR). + +## Project Structure +- **Components**: Place reusable UI components in `lib/components/`. +- **Pages**: Place route-level components in `lib/pages/`. + +## Common Patterns +- **Lists**: Prefer Dart collection-for and collection-if elements over`.map().toList()` to render lists of children. +- **Conditionals**: Prefer Dart `if` inside the children list over ternary operators for conditional rendering. + +## Best Practices + +When writing Jaspr components, adhere to these modern syntax rules: + +### Component Signature +Always use the `Component build(BuildContext context)` signature (not `Iterable` with `yield`). + +```dart +// ✅ Correct +@override +Component build(BuildContext context) { + return div([...]); +} + +// ❌ Avoid +@override +Iterable build(BuildContext context) sync* { + yield div([...]); +} +``` + +### Text Components +Use the dot-shorthand `.text()` for adding text nodes, which is cleaner than wrapping strings in `text()`. + +```dart +// ✅ Correct +div([ + .text('Hello World'), +]) + +// ❌ Avoid, Deprecated +div([ + text('Hello World'), +]) +``` + +### Links and Navigation + +Prefer standard `a` tags over `Link` components when you need full control over attributes or are migrating strict HTML. + +```dart +// ✅ Correct +a( + href: '/path', + classes: 'my-link', + events: {'click': (e) => ...}, // Easy to attach events + [.text('Go')] +) +``` + +### Positional Arguments for Children + +`div`, `span`, and other container components typically take children as a positional `List`. + +```dart +// ✅ Correct +div(classes: 'wrapper', [ + child1, + child2 +]) + +// ❌ Avoid +div(classes: 'wrapper', children: [ ... ]) +``` + +- Use `main_([...])` for rendering a `
` element. +- Use `Component.element(tag: 'xx', children: [...])` for an element that does not have a direct component. + +### Using Browser APIs and handling Global/Window Events + +Use `import 'package:universal_web/web.dart' as web;` for accessing standard browser APIs (e.g. `window` or `window.document`) when implementing browser-specific logic (location checking, scroll locking). + +Use `web.EventStreamProviders` to listen to window-level events in `initState` and cancel stream subscriptions in `dispose`. + +```dart +StreamSubscription? _resizeSubscription; + +@override +void initState() { + super.initState(); + if (kIsWeb) { + _resizeSubscription = web.EventStreamProviders.resizeEvent + .forTarget(web.window) + .listen((_) => setState(() {})); + } +} + +@override +void dispose() { + _resizeSubscription?.cancel(); + super.dispose(); +} +``` diff --git a/sites/www/.agents/skills/data-model/SKILL.md b/sites/www/.agents/skills/data-model/SKILL.md new file mode 100644 index 00000000000..716a4cce9c7 --- /dev/null +++ b/sites/www/.agents/skills/data-model/SKILL.md @@ -0,0 +1,177 @@ +--- +name: data-model +description: >- + Add or update a dart_mappable data model in lib/src/models/content/, + including adding format validation, regenerating code, and adding tests. + Use when adding a new content type or modifying an existing model's fields. +argument-hint: [data-model-description or existing-data-model] +--- + +# Data model skill + +Add or update a typed content model in this project. +Follow the established conventions below as much as possible. + +## Before starting + +1. If updating an existing model, read the model file, + its source YAML or JSON file(s), and its test group first. +2. If adding a new model, identify which page will use it and + the structure of the YAML file it will load from and map to. + If the YAML file doesn't exist, ask the user to create and reference it + or provide information about its expected structure. + +## Model file conventions + +All data models live in the `lib/src/models/content` directory and +should roughly follow this general structure: + +```dart +import 'package:dart_mappable/dart_mappable.dart'; + +import 'content_validation.dart'; + +part '.mapper.dart'; + +/// Doc comment: What this model represents and where it's loaded from. +/// +/// Expected data format: +/// - `field_name`: Description and constraints of the expected value. +@MappableClass() +class ModelName with ModelNameMappable { + ModelName({ + required this.fieldOne, + required this.fieldTwo, + this.optionalField, + }) { + // Validate all fields beyond their Dart type. + checkFormat(isNotBlank(fieldOne), 'field_one must be a non-empty string.'); + // For optional fields, only validate when present: + if (optionalField case final optionalField?) { + checkFormat(isNotBlank(optionalField), 'optional_field must be a non-empty string.'); + } + } + + /// Each field should have a doc comment that follows Effective Dart. + final String fieldOne; + + // Use `@MappableField` when the YAML key differs from the Dart field name. + @MappableField(key: 'field_two') + final String fieldTwo; + + // Optional fields are nullable and not marked `required` in the constructor. + final String? optionalField; + + // Every model must have this static factory. Use the generated mapper. + static ModelName fromJson(Map json) => ModelNameMapper.fromMap(json); +} +``` + +When adding a new data model, +consider checking the format of one or more existing models +in the `lib/src/models/content/` directory. + +### Key guidelines + +- The Dart code you write for the models should follow + Effective Dart and other Dart best practices and standards. +- Import the `content_validation.dart` library and + use its helper functions to validate the contents of each field. +- The `part` directive must point to `.mapper.dart`. + That part file is generated when running `build_runner`. +- The mixed-in mixin's name is always `Mappable`. + That mixin is generated when running `build_runner`. +- The `fromJson` factory delegates to `Mapper.fromMap(json)`. +- Use `@MappableField(key: 'yaml_key')` when the YAML key uses + snake_case or otherwise differs from the `camelCase` Dart field name. +- When a field is limited to a set of allowed values, + create and use a new enum for the Dart type. + To be serialized and deserialized, annotate the enum with `@MappableEnum`. +- For fields that need custom deserialization from YAML strings, + create a private `MappingHook` subclass in the same file. +- All fields on the class should be statically typed and marked `final`. +- Add documentation comments on the class and on every field, + following Effective Dart guidelines for doc comments. +- The class doc comment must include an "Expected data format" section + listing each field, its brief meaning, and its constraints. + +## Validation rules + +When users might make a mistake or a specific format is needed, +fields should be validated in the constructor body, +not just by Dart's type system. + +Validation helpers are defined in +the `lib/src/models/content/content_validation.dart` library. +Some common validations include: + +| Field type | Validation | +|------------------|----------------------------------------------------------------------| +| Required string | `checkFormat(isNotBlank(field), '...')` | +| Optional string | `if (field case final field?) checkFormat(isNotBlank(field), '...')` | +| Absolute URL | `checkFormat(isAbsoluteHttpUrl(field), '...')` | +| Image asset path | `checkFormat(looksLikeImageAssetPath(field), '...')` | +| Hex color | `checkFormat(isHexColor(field), '...')` | +| Non-empty list | `checkFormat(field.isNotEmpty, '...')` | + +As appropriate, multiple validations can be completed. +Complete the less specific ones first, such as not being blank. + +If you think any other validation is needed or might be helpful: + +1. Ensure it doesn't already exist in the `content_validation.dart` library. +2. Add a reusable function to the `content_validation.dart` library. +3. Provide a useful doc comment, following Effective Dart best practices. +4. If it might be commonly useful, add it to this skill's table. +5. Make use of the new validation in the constructor body. + +## After creating or modifying the model file + +1. **Run code generation** to produce or update the `.mapper.dart` file: + + ```bash + dart run build_runner build --delete-conflicting-outputs + ``` + +2. **Add or update tests** in `test/models/content/content_models_test.dart`. + + Read the file to understand the existing testing patterns, + import the new model, and add a test group following a similar pattern. + + The test file already defines a few custom matchers. + If needed, reuse them, don't unnecessarily redefine them. + + - `_throwsMapperException`: + For fields that are missing or have the wrong type. + - `_throwsValidationError`: + For fields that exist but fail validation. + +3. **Run tests** to verify: + + ```bash + dart test test/models/content/content_models_test.dart + ``` + +4. **Run analysis** to catch any lint issues: + + ```bash + dart analyze lib/src/models/content/ + ``` + +## Use the data model from a page + +If you already are or want to use the data in a page, access the data using +the `decodeJsonList` and `decodeJsonObject` extension methods on `BuildContext`. +At the beginning of a page component's `build` method, +use the extension methods and store the data in a variable for reuse. + +```dart +// For a list of items: +final items = context.decodeJsonList('page_name.data_key', ModelName.fromJson); + +// For a single object: +final item = context.decodeJsonObject('page_name.data_key', ModelName.fromJson); +``` + +The dot-notation path maps to the content directory structure. For example, +`page_name.data_key` resolves to `content/page_name/data_key.yaml`. diff --git a/sites/www/.agents/skills/extract-to-jaspr/SKILL.md b/sites/www/.agents/skills/extract-to-jaspr/SKILL.md new file mode 100644 index 00000000000..0a33bcd0a83 --- /dev/null +++ b/sites/www/.agents/skills/extract-to-jaspr/SKILL.md @@ -0,0 +1,70 @@ +--- +name: extract-to-jaspr +description: Extracts a part of a website and converts it to a Jaspr component. Use when you need to migrate a part of a website to Jaspr. +--- + +# Jaspr Migration Skill + +This document outlines the process and key learnings from extracting a complex HTML component from a live website to a Jaspr component using Dart. + +## When to use this skill + +Use this skill when you need to extract a part of a website and migrate it to Jaspr. + +## How to use it + +The migration process follows a strict "Structure Only" approach: + +1. **Fetch & Extract**: + - Use `curl` to fetch the raw HTML. This ensures you get the initial server-rendered markup without client-side modifications. + - If needed, use browser dev tools to identifying the correct DOM node, but rely on `curl` for the source extraction. + - Note any dynamic classes or attributes controlled by JavaScript. + +2. **Markup Translation (Exact Match)**: + - Create a single `StatelessComponent` for the extracted HTML. + - Translate HTML tags 1:1 to Jaspr components (`div`, `nav`, `ul`, `li`, `img`, etc.). + - **Maintain strict fidelity**: Keep original CSS classes, IDs and all attributes exactly as they are. This ensures existing stylesheets work without modification. + - Specifically keep any logic-based attributes (e.g. `x-` attributes from alpine.js) as is and DO NOT ATTEMPT TO RE-IMPLEMENT LOGIC in Dart. + +### Asset Handling + +When encountering assets (images, videos, etc.), look for them in `/assets/src/img` or `/assets/src/video`. +**Note**: The production site appends hashes to asset names, but the source files do not have them. + +Use the `asset()` function imported from `lib/constants/asset_loader.dart` with the non-hashed filename. It returns the correct path after bundling. + +```dart +img(src: asset('my-image.png'), alt: 'My Image') +``` + +### Data-Driven Components + +For components with repetitive or dynamic content (like carousels, event grids, or country lists), separate the data from the structure: + +1. **Extract Data to YAML**: Identify repetitive sections and extract their content into a YAML file in `content/_data/` (e.g., `my_data_file.yaml`). +2. **Access Data via Context**: Use `package:jaspr_content/jaspr_content.dart` to access the data in your component. +3. **Dynamic Rendering**: Use Dart collection-for to render the items, keeping the HTML structure inside the loop consistent with the original. + +```dart +import 'package:jaspr_content/jaspr_content.dart'; + +// Inside build method +final items = context.page.data['my_data_file'] as List? ?? []; + +div(classes: 'grid', [ + for (final item in items) + _buildItem(item as Map), +]) +``` + +### Reusing Sections + +When possible, reuse existing sections from `lib/components/sections` like the `CtaSection` or `NewsletterSection`. + +Do not add new sections yourself. + +## Desired Outcome + +The desired outcome is 1-to-1 translation of the HTML to Jaspr. The component should be as close to the original HTML as possible. + +**Fidelity is King**: When porting, trust that the original CSS/HTML structure is correct. Don't refactor the *structure* while migrating the *technology*. Data-driven patterns should enhance maintainability without changing the rendered HTML. \ No newline at end of file diff --git a/sites/www/.agents/skills/generate-showcase-from-video/SKILL.md b/sites/www/.agents/skills/generate-showcase-from-video/SKILL.md new file mode 100644 index 00000000000..c2325fbe8ca --- /dev/null +++ b/sites/www/.agents/skills/generate-showcase-from-video/SKILL.md @@ -0,0 +1,62 @@ +--- +name: generate-showcase-from-video +description: Extracts YouTube transcripts and generates professional Flutter showcase blog posts in Markdown format. Use when you need to create a technical marketing case study from a video success story. +--- + +# Generate showcase from video + +## Overview + +This skill automates the creation of high-quality Flutter case studies from video interviews or presentations. It fetches the transcript, analyzes the business and technical impact, and formats a blog post suitable for the official Flutter showcase. + +## Workflow + +### 1. Extract transcript + +- Prompt the user for a YouTube URL if one hasn't been provided. +- Execute the transcript extraction script: + ```bash + dart run tool/get_video_transcript.dart "" + ``` + +### 2. Analyze & generate + +- Analyze the transcript to identify: + - **Customer/Company name**: Used for the final filename. + - **Goal**: The problem they were solving (this content should be part of the introductory paragraphs without a header). + - **Why Flutter**: Reasons for choosing Flutter. + - **Their solution**: Technical implementation details (mapped to the **Their solution** header). + - **Key metrics**: Quantifiable wins (Velocity, Reuse, FPS, Team size, etc. - mapped to the **Results** header). +- **CRITICAL**: **DO NOT** use Markdown headers (e.g. `# Header`) in the content. Use **Bold Text** for the section titles as specified in [references/blog-format.md](references/blog-format.md). +- Use the detailed structure and tone guidelines in `references/blog-format.md`. + +### 3. Generate image assets + +- **MANDATORY**: Request an image (logo or app icon) from the user directly using the chat UI. The user can drag and drop or attach the image to the chat. +- **PROHIBITION**: **DO NOT** use browser tools, search engines, or external websites to find the logo yourself. You must always wait for the user to provide the official asset. +- **Image naming**: Image filenames (logo and card) MUST use underscores to separate words, even if the directory or slug uses hyphens (e.g., `global_citizen_logo.png`). +- Once the image is attached, copy it to `content/showcase/images/third_party/case_studies//_logo.png`. +- Run the automatic padding script to generate a perfectly fitted 1450x1080 Showcase Card with a white background: + ```bash + dart run tool/generate_showcase_card.dart "content/showcase/images/third_party/case_studies//_logo.png" "content/showcase/images/third_party/case_studies//_card.png" + ``` + +### 4. Output Markdown & update YAML + +- Create the final Markdown file directly in the `content/showcase/` directory. **DO NOT** create any standalone blog draft files or scratch `.md` files anywhere else in the project. The only markdown output should be the final showcase file. +- **Filename**: `content/showcase/.md` (e.g., `content/showcase/bmw.md`, `content/showcase/nubank.md`). +- **Strict frontmatter schema**: Ensure the output follows the professional, data-driven tone specified in the guidelines. **MANDATORY**: You MUST follow the exact YAML frontmatter schema defined in [references/blog-format.md](references/blog-format.md). + - **YAML safety**: Always quote values that contain colons. + - **Headline**: The `headline` field MUST be exactly the `company_name` (e.g., `headline: "BMW"`). Do NOT add descriptions or slogans to the headline. + - Specifically, `success_metrics` must include `type`, `value` (with `perc`, `unit`, and `desc`), and `id`. + - Include the date field: `publishDate`. +- Include the `video_embed_url` in the frontmatter if provided, formatting standard YouTube links as `/embed/` links (e.g., `https://www.youtube.com/embed/A3ApoV_QRio`). +- Make sure to map `logo:` and `card:` in the frontmatter to the newly generated `content/showcase/images/third_party/case_studies//` images. +- Ensure the company is added to `content/showcase/data/companies.yaml` if it doesn't already exist. + +## Best practices + +- **Human-like tone**: Avoid robotic phrasing. The blog should feel authentic and well-reasoned. +- **Metrics focus**: Always look for numbers. If the video mentions "shipped in 4 months," include it. +- **Safety**: Do not exaggerate claims beyond what is explicitly stated or strongly implied in the transcript. +- **Logos**: Never "guess" or search for a logo online. Brands are very specific about their visual identity; using an incorrect or low-quality logo from the web can damage the professional look of the showcase. diff --git a/sites/www/.agents/skills/generate-showcase-from-video/references/blog-format.md b/sites/www/.agents/skills/generate-showcase-from-video/references/blog-format.md new file mode 100644 index 00000000000..eda4d520083 --- /dev/null +++ b/sites/www/.agents/skills/generate-showcase-from-video/references/blog-format.md @@ -0,0 +1,107 @@ +# Flutter showcase post format + +You are a professional technical marketing writer specializing in creating compelling developer case studies for the official Flutter showcase on flutter.dev. + +Your audience is technical decision-makers (CTOs, VPs of Engineering, Tech Leads) who are evaluating Flutter for their projects. Your goal is to persuade them of Flutter's value by highlighting tangible business and technical wins from a real-world success story. + +From the provided transcript, generate a case study blog post that follows this structure: + +* Briefly introduce the company and their application and what types of services they offer. +* State the core business or technical challenge they were trying to solve. +* **CRITICAL**: This introduction section **MUST NOT** have a header (e.g., do not use `**Introduction**` or `**Goal**`). The text should start immediately after the frontmatter. + +**Quick intro** +* Add quick intro on the company or product and the business challenge they were trying to solve. + + +**Why Flutter?** +* Explain the key reasons they chose Flutter over other technologies. +* Focus on factors that matter to decision-makers, such as cross-platform capabilities, performance, and developer experience. + +**Their solution: Building with Flutter** +* Describe how the team used Flutter to build their application. +* Mention any specific Flutter features, packages, or architectural patterns that were critical to their success. + +**Key results and business impact** +* This is the most important section. Use a bulleted list or a direct paragraph to present quantifiable achievements. If there are specific numbers, make sure to mention them! +* Focus on metrics like: + * **Developer velocity:** e.g., "Reduced time-to-market by 40%." + * **Code reusability:** e.g., "Achieved 95% code reuse between iOS and Android." + * **Performance:** e.g., "Maintained a consistent 60 FPS for all animations." + * **Team size/cost:** e.g., "Shipped on two platforms with a team of just 5 engineers." + * **User engagement:** e.g., "Increased user session length by 25% due to the new, fluid UI." + +**Tone and formatting rules:** +* **PROHIBITION**: **DO NOT** use standard Markdown headers (e.g., `# Header`, `## Header`, `### Header`) in the body of the blog post. +* **REQUIRED**: Use **Bold Text** (e.g., `**Why Flutter?**`) for section titles, exactly as shown in the structure above. Do **NOT** add an `**Introduction**` or `**Goal**` header to the first section. +* **Tone**: Professional, friendly, approachable, confident, and data-driven. Avoid overly technical jargon unless it's essential. The focus should be on the *results* and *impact* of using Flutter. +* **Authenticity**: Make sure the content sounds like it was written by a human and do not exaggerate claims. + +## YAML frontmatter schema + +All showcase files MUST include the following YAML frontmatter at the top of the file. + +> [!IMPORTANT] +> **YAML Syntax Rules:** +> 1. **Colons in Values:** If a value (like `headline` or `title`) contains a colon, the entire value MUST be wrapped in double quotes. +> - ❌ `headline` +> - ✅ `"headline"` +> 2. **Success Metrics Formatting:** +> - `value` contains `perc` and `desc`. +> - `perc` is the primary number or value. + +```yaml +--- +title: "Company Name" +description: "A short SEO description." +headline: "Company Name" # MUST be exactly the company name +summary: "A short summary of the win." +appName: "App Name" +companyName: "Company Name" +logo: images/third_party/case_studies/company_name/company_name_logo.png +card: images/third_party/case_studies/company_name/company_name_card.png +videoEmbedUrl: "https://www.youtube.com/embed/XXXXXX" +# One or more of the following locations they and/or their app operate in: +locations: + - Asia + - Africa + - North America + - South America + - Europe + - Oceania +# The platforms they support, from the following list: +platforms: + - Mobile + - Desktop + - Web + - Embedded +# One or more of the following industries relevant to their app: +industries: + - Banking & Finance + - Health + - Games + - Travel & Lifestyle + - Productivity + - Education + - Social +successMetrics: + - perc: 95 + desc: code reuse +# One or more of the following categorical tags related to the case study: +tags: + - monetization + - games + - news + - ai + - mobile + - android + - ios + - desktop + - macos + - windows + - linux + - web + - embedded +publishDate: YYYY-MM-DD +--- +``` diff --git a/sites/www/.editorconfig b/sites/www/.editorconfig new file mode 100644 index 00000000000..f18e0f5f1ee --- /dev/null +++ b/sites/www/.editorconfig @@ -0,0 +1,17 @@ +# Configures default editor settings for the repository. +# To learn more, visit the EditorConfig website: https://editorconfig.org. + +# This is top-most EditorConfig file for the repository. +root = true + +# Default configuration for all files in the repository. +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space + +# Configuration for common code and data file formats. +[*.{css,dart,json,yaml,yml}] +indent_size = 2 +trim_trailing_whitespace = true diff --git a/sites/www/.firebaserc b/sites/www/.firebaserc new file mode 100644 index 00000000000..de2e5417b5a --- /dev/null +++ b/sites/www/.firebaserc @@ -0,0 +1,5 @@ +{ + "projects": { + "default": "flutter-dev-230821" + } +} diff --git a/sites/www/.gitignore b/sites/www/.gitignore new file mode 100644 index 00000000000..25805e4ffa2 --- /dev/null +++ b/sites/www/.gitignore @@ -0,0 +1,41 @@ +# Files and directories created by pub. +**/doc/api/ +.dart_tool/ +.packages +old_site/ + +# Conventional directory for build output. +/build/ + +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter related +.flutter-plugins +.flutter-plugins-dependencies + +.firebase/ + +content/_database/ +content/main.css +tool/used_assets.txt diff --git a/sites/www/AGENTS.md b/sites/www/AGENTS.md new file mode 100644 index 00000000000..6b1c449c0f3 --- /dev/null +++ b/sites/www/AGENTS.md @@ -0,0 +1,174 @@ +# AGENTS.md + +This file provides guidance to agentic coding tools when +working with or understanding code in this repository. + +## Project overview + +This repository contains the source code for the Flutter website. +Flutter is an open-source framework for building beautiful, +natively compiled, multi-platform applications from a single codebase. + +It is hosted at [`flutter.dev`](https://flutter.dev) and shouldn't be confused +with the docs website (`docs.flutter.dev`) or the API docs (`api.flutter.dev`). +This website is sometimes called the "Flutter marketing website" as +its primary focus is providing information to +potential Flutter developers, businesses, and partners. + +The website is statically built and implemented with +the Dart programming language and the [Jaspr](https://jaspr.site) framework. +It also uses [Jaspr Content](https://docs.jaspr.site/content) for +loading data and content as well as handling assets. + +Content lives in Markdown and YAML files in the `content/` directory, +while the supporting Dart code lives in the `lib/` directory. + +## Common commands + +The following snippet contains some common commands that +you'll need to run when working on the website. + +```bash +# Install dependencies, matching the constraints in pubspec.yaml. +dart pub get + +# Start the Jaspr development server at http://localhost:8080/. +dart pub global run jaspr_cli:jaspr serve + +# Statically build the production site, output to `build/jaspr/`. +dart pub global run jaspr_cli:jaspr build + +# Run all the tests defined in the `/test` directory. +dart test + +# Run code generation, which includes +# generating the serialization logic for the data models. +dart run build_runner build --delete-conflicting-outputs + +# Format code in the current directory. +dart format . + +# Analyze Dart sources in the current directory. +dart analyze +``` + +## Architecture + +### Server/client split + +Our Jaspr setup has a server/client architecture: + +- `lib/main.server.dart` acts as the entrypoint on the server. + It configures static site generation, including Jaspr Content, + such as setting up routes, content loaders, layouts, and asset transformers. +- `lib/main.client.dart` acts as the entrypoint on the client. + It automatically runs the hydration of + interactive client-components that are annotated with `@client`. + Additional imperative code that should be run on the client + can be called from here as well. + +### Content-to-page pipeline + +1. **Content files** (`content/`) + + YAML data files and Markdown pages with YAML frontmatter. + +2. **Loaders** + + - `FilesystemLoader` discovers and loads Markdown files. + - `FilesystemDataLoader` loads YAML and JSON files, + that is then accessible under `page.data`. + +3. **Data access** + + The `DataContext` extension (`lib/src/utils/data_utils.dart`) provides + `decodeJsonObject()` and `decodeJsonList()` using dot-notation paths. + For example, + `context.decodeJsonList('home.latest_news', HomeNewsItem.fromJson)` + loads `content/home/latest_news.yaml` typed as a list of `HomeNewsItem`. + +4. **Data models** (`lib/src/models/content/`) + + Data models defined using `package:dart_mappable` for YAML and JSON data. + + For detailed conventions on adding or updating data models, check out + the `data-model` skill in `.agents/skills/data-model/SKILL.md`. + +5. **Pages** (`lib/src/pages/`) + + Jaspr components that represent the full layout and design of a page. + Registered in `lib/main.server.dart` and + usually used from the corresponding pages with an MDX-style syntax. + +6. **Layouts** (`lib/src/layouts/`) + + `DefaultLayout` wraps all pages with HTML document structure (head, analytics, header, footer). + `ShowcaseStoryLayout` extends it for `/showcase/*` story pages, + auto-applied via `ShowcaseStoryExtension`. + Layouts implement `PageLayout` and are registered by pattern name. + +7. **Components** (`lib/src/components/`) + + When a page or layout has or needs a reusable or shareable piece of UI, + it's usually implemented as a Jaspr component in this directory. + + - Use `StatelessComponent` for purely presentational components that + do not manage local state. + - Use `StatefulComponent` only when internal state management, + such as animations, form input handling, or similar is required. + - If the component requires browser-specific APIs or + interactivity that can't be server-side rendered, + annotate the component class with `@client`. + +### Asset pipeline + +Three asset transformers chain in `main.server.dart`: + +- `TrackingAssetTransformer` - + Logs used assets to the `tool/used_assets.txt` file. +- `ResizingAssetTransformer` - + Currently resizes supported images to expected widths. +- `HashingAssetTransformer` - + Adds content hashes for cache busting. + +Site styles are written in SCSS in `assets/src/css` and +built with `package:sass_builder` automatically during the build. + +## Coding guidelines and best practices + +### Dart-specific guidelines + +When writing or editing Dart code, +follow these guidelines: + +- Follow Dart and programming best practices, especially the + official [Effective Dart](https://dart.dev/effective-dart) guidelines. +- Use `const` for variables and values where possible, + otherwise prefer `final` over `var` for variables. +- Avoid implicit and explicit usage of `dynamic`. + Use `Object?` instead when a top type is needed. +- Explicitly specify generic type arguments to avoid implicit `dynamic`. +- Inline comments should be useful, written in complete sentences, + and placed before the relevant code, not as a trailing comment. +- Rather than imperatively building collections, + prefer using collection literals and a combination of + [collection elements](https://dart.dev/language/collections#collection-elements), + such as if, for, spread, and null-aware elements. +- Add helpful documentation comments to public members. + The doc comments should use the syntax supported by `dart doc` and + follow the Effective Dart + [guidelines for documentation](https://dart.dev/effective-dart/documentation). + +### Jaspr-specific guidelines + +When writing or editing Jaspr code, particularly Jaspr components, +follow these guidelines in addition to the Dart guidelines: + +- Components should be immutable, `const` when possible. + and ideally, they should be stateless as well. + When mutable state is needed, use a `StatefulComponent`, + and keep mutable state in its separate `State` class. +- Rather than huge `build` methods or + private helper methods that return components, + prefer to break down large components + into smaller, private components. diff --git a/sites/www/LICENSE b/sites/www/LICENSE new file mode 100644 index 00000000000..2322ed1aafb --- /dev/null +++ b/sites/www/LICENSE @@ -0,0 +1,32 @@ +Except as otherwise noted, the content of this repository is licensed under +the Creative Commons Attribution 4.0 License [1] while +code and code samples are licensed under the 3-Clause BSD License: + +Copyright 2026 The Flutter Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of Google LLC nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +[1] https://creativecommons.org/licenses/by/4.0/ diff --git a/sites/www/README.md b/sites/www/README.md new file mode 100644 index 00000000000..11a0b9da566 --- /dev/null +++ b/sites/www/README.md @@ -0,0 +1,86 @@ +Flutter's wordmark logo. + +# [Flutter][] website source + +The website for the Flutter open-source framework, +hosted at [flutter.dev](https://flutter.dev). + +The website is implemented and statically generated with +[Dart][], [Jaspr][], and [Jaspr Content][] then +built using [Google Cloud Build][] and deployed to [Firebase][]. + +[Flutter]: https://flutter.dev +[Dart]: https://dart.dev +[Jaspr]: https://jaspr.site +[Jaspr Content]: https://docs.jaspr.site/content +[Google Cloud Build]: https://cloud.google.com/build +[Firebase]: https://firebase.google.com + +## Contribute + +### Get the prerequisites + +- [Flutter SDK][Install Flutter] + + To build and develop the site, you'll need to + install the latest stable release of Flutter, which includes Dart. + + If you don't have Flutter or need to update, follow the + instructions at [Install Flutter][] or [Upgrade Flutter][]. + + If you already have Flutter installed, verify it's on your path + and already on the latest stable version: + + ```bash + flutter --version + ``` + +- [Jaspr CLI][] + + Ensure the latest version of the Jaspr CLI is installed by + running `dart pub global activate jaspr_cli`. + + To directly use the `jaspr` CLI command, + the pub system cache's `bin` directory must be on your PATH. + If running `jaspr --help` doesn't work, follow the + instructions on [Running a script from your PATH][pub-global-run]. + +[Install Flutter]: https://docs.flutter.dev/install +[Upgrade Flutter]: https://docs.flutter.dev/install/upgrade +[Jaspr CLI]: https://pub.dev/packages/jaspr_cli +[pub-global-run]: https://dart.dev/tools/pub/cmd/pub-global#running-a-script-from-your-path + +### Develop + +Run the development server with hot-reloading: + +```bash +jaspr serve +``` + +The site will be available at `http://localhost:8080`. + +### Build + +Generate the static site: + +```bash +jaspr build +``` + +The output will be in the `build/jaspr/` directory. + +## Project structure + +- `content/`: Contains all static content (Markdown, YAML, JSON). + This is where most site data lives. +- `lib/`: The core Dart source code. + - `pages/`: Route-level components, + such as `home_page.dart` and `consultants_page.dart`. + - `components/`: Reusable UI components. + - `layouts/`: Website templates and page layouts, + such as `default_layout.dart`. + - `models/`: Data models for content. + - `data/`: Dart-native data providers and constants. +- `assets/`: Static assets like images and styles. +- `web/`: Web-specific entry points and configuration. diff --git a/sites/www/analysis_options.yaml b/sites/www/analysis_options.yaml new file mode 100644 index 00000000000..af945f2a612 --- /dev/null +++ b/sites/www/analysis_options.yaml @@ -0,0 +1,30 @@ +include: package:analysis_defaults/analysis.yaml + +analyzer: + language: + strict-casts: true + strict-inference: true + strict-raw-types: true + +linter: + rules: + # Disabled for now since we have a lot of strings in code currently. + lines_longer_than_80_chars: false + + avoid_private_typedef_functions: true + avoid_type_to_string: true + avoid_void_async: true + literal_only_boolean_expressions: true + missing_code_block_language_in_doc_comment: true + no_runtimeType_toString: true + no_self_assignments: true + prefer_const_constructors_in_immutables: true + prefer_const_constructors: true + prefer_const_declarations: true + prefer_const_literals_to_create_immutables: true + prefer_final_in_for_each: true + prefer_final_locals: true + prefer_if_elements_to_conditional_expressions: true + +formatter: + trailing_commas: preserve diff --git a/sites/www/build.yaml b/sites/www/build.yaml new file mode 100644 index 00000000000..314c4980a7f --- /dev/null +++ b/sites/www/build.yaml @@ -0,0 +1,32 @@ +builders: + stylesHashBuilder: + import: 'package:flutter_website/builders.dart' + builder_factories: [ 'stylesHashBuilder' ] + build_extensions: + "web/main.scss": + - "lib/src/style_hash.dart" + auto_apply: root_package + build_to: source + +targets: + $default: + builders: + build_web_compilers:entrypoint: + dev_options: + compilers: + dartdevc: + release_options: + # Use production compilers for release builds and + # ensure kReleaseMode in jaspr is enabled. + compilers: + dart2js: + args: + - --no-source-maps + - -O4 + - -Djaspr.flags.release=true + # Disable for now. + # dart2wasm: + # args: [-O2, -Djaspr.flags.release=true] + flutter_website:stylesHashBuilder: + dev_options: + fixed_hash: true diff --git a/sites/www/content/ai/images/ask-dash.png b/sites/www/content/ai/images/ask-dash.png new file mode 100644 index 00000000000..db612d87ea6 Binary files /dev/null and b/sites/www/content/ai/images/ask-dash.png differ diff --git a/sites/www/content/ai/images/build-with-ai/broader-ai-ecosystem.png b/sites/www/content/ai/images/build-with-ai/broader-ai-ecosystem.png new file mode 100644 index 00000000000..8d9791d5aed Binary files /dev/null and b/sites/www/content/ai/images/build-with-ai/broader-ai-ecosystem.png differ diff --git a/sites/www/content/ai/images/build-with-ai/build-with-ai-hero.png b/sites/www/content/ai/images/build-with-ai/build-with-ai-hero.png new file mode 100644 index 00000000000..371e7274a42 Binary files /dev/null and b/sites/www/content/ai/images/build-with-ai/build-with-ai-hero.png differ diff --git a/sites/www/content/ai/images/build-with-ai/expand-functionality.png b/sites/www/content/ai/images/build-with-ai/expand-functionality.png new file mode 100644 index 00000000000..f1c905c44d1 Binary files /dev/null and b/sites/www/content/ai/images/build-with-ai/expand-functionality.png differ diff --git a/sites/www/content/ai/images/build-with-ai/fast-ai-development.png b/sites/www/content/ai/images/build-with-ai/fast-ai-development.png new file mode 100644 index 00000000000..9f6fb88734d Binary files /dev/null and b/sites/www/content/ai/images/build-with-ai/fast-ai-development.png differ diff --git a/sites/www/content/ai/images/build-with-ai/flutter-ai-toolkit.png b/sites/www/content/ai/images/build-with-ai/flutter-ai-toolkit.png new file mode 100644 index 00000000000..ed1e666f972 Binary files /dev/null and b/sites/www/content/ai/images/build-with-ai/flutter-ai-toolkit.png differ diff --git a/sites/www/content/ai/images/build-with-ai/gemini-tab.png b/sites/www/content/ai/images/build-with-ai/gemini-tab.png new file mode 100644 index 00000000000..5ab6b1f3472 Binary files /dev/null and b/sites/www/content/ai/images/build-with-ai/gemini-tab.png differ diff --git a/sites/www/content/ai/images/build-with-ai/the-best-of-google.png b/sites/www/content/ai/images/build-with-ai/the-best-of-google.png new file mode 100644 index 00000000000..4888fd4a873 Binary files /dev/null and b/sites/www/content/ai/images/build-with-ai/the-best-of-google.png differ diff --git a/sites/www/content/ai/images/build-with-ai/vertex-tab.png b/sites/www/content/ai/images/build-with-ai/vertex-tab.png new file mode 100644 index 00000000000..8008895b688 Binary files /dev/null and b/sites/www/content/ai/images/build-with-ai/vertex-tab.png differ diff --git a/sites/www/content/ai/images/flutter-logo.png b/sites/www/content/ai/images/flutter-logo.png new file mode 100644 index 00000000000..a9e41098736 Binary files /dev/null and b/sites/www/content/ai/images/flutter-logo.png differ diff --git a/sites/www/content/ai/images/genkit.jpg b/sites/www/content/ai/images/genkit.jpg new file mode 100644 index 00000000000..82404433f6e Binary files /dev/null and b/sites/www/content/ai/images/genkit.jpg differ diff --git a/sites/www/content/ai/index.md b/sites/www/content/ai/index.md new file mode 100644 index 00000000000..35f7196b415 --- /dev/null +++ b/sites/www/content/ai/index.md @@ -0,0 +1,9 @@ +--- +title: AI +bodyTags: interior buildWithAI +description: >- + Build and deploy intelligent AI-driven features across platforms with Flutter. +publishDate: "2024-05-14" +--- + + diff --git a/sites/www/content/ai/samples.yaml b/sites/www/content/ai/samples.yaml new file mode 100644 index 00000000000..09be1f3f5c2 --- /dev/null +++ b/sites/www/content/ai/samples.yaml @@ -0,0 +1,12 @@ +# This file contains the source data used to populate the +# "Explore Flutter + AI samples" carousel on the https://flutter.dev/ai page. +# +# If you have a sample or demo you'd like to be listed, +# please open an issue or pull request with more information. + +- title: "Chat app with GenUI" + href: "https://github.com/flutter/genui/tree/main/examples/simple_chat" + image: "images/flutter-logo.png" +- title: "Firebase AI Logic showcase" + href: "https://github.com/flutter/demos/tree/main/firebase_ai_logic_showcase" + image: "images/build-with-ai/vertex-tab.png" diff --git a/sites/www/content/banner.yaml b/sites/www/content/banner.yaml new file mode 100644 index 00000000000..0544770b364 --- /dev/null +++ b/sites/www/content/banner.yaml @@ -0,0 +1,2 @@ +text: Flutter is back at Google I/O on May 19-20! Register now +link: https://io.google/2026/?utm_source=flutter&utm_medium=embedded_marketing&utm_campaign=flutter diff --git a/sites/www/content/brand/assets/alignment-bad.png b/sites/www/content/brand/assets/alignment-bad.png new file mode 100644 index 00000000000..9df2a7d1d94 Binary files /dev/null and b/sites/www/content/brand/assets/alignment-bad.png differ diff --git a/sites/www/content/brand/assets/alignment-good.png b/sites/www/content/brand/assets/alignment-good.png new file mode 100644 index 00000000000..f3a2d8c5d9b Binary files /dev/null and b/sites/www/content/brand/assets/alignment-good.png differ diff --git a/sites/www/content/brand/assets/dashatar-dash.png b/sites/www/content/brand/assets/dashatar-dash.png new file mode 100644 index 00000000000..6e952fe9620 Binary files /dev/null and b/sites/www/content/brand/assets/dashatar-dash.png differ diff --git a/sites/www/content/brand/assets/flutter-brand-assets/icon_flutter/icon_flutter.png b/sites/www/content/brand/assets/flutter-brand-assets/icon_flutter/icon_flutter.png new file mode 100644 index 00000000000..4d545bd7ab8 Binary files /dev/null and b/sites/www/content/brand/assets/flutter-brand-assets/icon_flutter/icon_flutter.png differ diff --git a/sites/www/content/brand/assets/flutter-brand-assets/icon_flutter/icon_flutter.svg b/sites/www/content/brand/assets/flutter-brand-assets/icon_flutter/icon_flutter.svg new file mode 100644 index 00000000000..efe70706bde --- /dev/null +++ b/sites/www/content/brand/assets/flutter-brand-assets/icon_flutter/icon_flutter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sites/www/content/brand/assets/flutter-brand-assets/icon_flutter/icon_flutter_dk-blue.png b/sites/www/content/brand/assets/flutter-brand-assets/icon_flutter/icon_flutter_dk-blue.png new file mode 100644 index 00000000000..ab22fed7219 Binary files /dev/null and b/sites/www/content/brand/assets/flutter-brand-assets/icon_flutter/icon_flutter_dk-blue.png differ diff --git a/sites/www/content/brand/assets/flutter-brand-assets/icon_flutter/icon_flutter_dk-blue.svg b/sites/www/content/brand/assets/flutter-brand-assets/icon_flutter/icon_flutter_dk-blue.svg new file mode 100644 index 00000000000..eb13ef4a2a1 --- /dev/null +++ b/sites/www/content/brand/assets/flutter-brand-assets/icon_flutter/icon_flutter_dk-blue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sites/www/content/brand/assets/flutter-brand-assets/icon_flutter/icon_flutter_dk-blue@2x.png b/sites/www/content/brand/assets/flutter-brand-assets/icon_flutter/icon_flutter_dk-blue@2x.png new file mode 100644 index 00000000000..c88e92e7b5d Binary files /dev/null and b/sites/www/content/brand/assets/flutter-brand-assets/icon_flutter/icon_flutter_dk-blue@2x.png differ diff --git a/sites/www/content/brand/assets/flutter-brand-assets/icon_flutter/icon_flutter_solid.png b/sites/www/content/brand/assets/flutter-brand-assets/icon_flutter/icon_flutter_solid.png new file mode 100644 index 00000000000..6ed42430444 Binary files /dev/null and b/sites/www/content/brand/assets/flutter-brand-assets/icon_flutter/icon_flutter_solid.png differ diff --git a/sites/www/content/brand/assets/flutter-brand-assets/icon_flutter/icon_flutter_solid.svg b/sites/www/content/brand/assets/flutter-brand-assets/icon_flutter/icon_flutter_solid.svg new file mode 100644 index 00000000000..6858e0a5316 --- /dev/null +++ b/sites/www/content/brand/assets/flutter-brand-assets/icon_flutter/icon_flutter_solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sites/www/content/brand/assets/flutter-brand-assets/icon_flutter/icon_flutter_wht.png b/sites/www/content/brand/assets/flutter-brand-assets/icon_flutter/icon_flutter_wht.png new file mode 100644 index 00000000000..2edb4964e47 Binary files /dev/null and b/sites/www/content/brand/assets/flutter-brand-assets/icon_flutter/icon_flutter_wht.png differ diff --git a/sites/www/content/brand/assets/flutter-brand-assets/icon_flutter/icon_flutter_wht.svg b/sites/www/content/brand/assets/flutter-brand-assets/icon_flutter/icon_flutter_wht.svg new file mode 100644 index 00000000000..b4d0c00034b --- /dev/null +++ b/sites/www/content/brand/assets/flutter-brand-assets/icon_flutter/icon_flutter_wht.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sites/www/content/brand/assets/flutter-brand-assets/lockup_built-w-flutter/lockup_built-w-flutter.png b/sites/www/content/brand/assets/flutter-brand-assets/lockup_built-w-flutter/lockup_built-w-flutter.png new file mode 100644 index 00000000000..d3a139a4b01 Binary files /dev/null and b/sites/www/content/brand/assets/flutter-brand-assets/lockup_built-w-flutter/lockup_built-w-flutter.png differ diff --git a/sites/www/content/brand/assets/flutter-brand-assets/lockup_built-w-flutter/lockup_built-w-flutter.svg b/sites/www/content/brand/assets/flutter-brand-assets/lockup_built-w-flutter/lockup_built-w-flutter.svg new file mode 100644 index 00000000000..779f03ecce5 --- /dev/null +++ b/sites/www/content/brand/assets/flutter-brand-assets/lockup_built-w-flutter/lockup_built-w-flutter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sites/www/content/brand/assets/flutter-brand-assets/lockup_built-w-flutter/lockup_built-w-flutter_solid.png b/sites/www/content/brand/assets/flutter-brand-assets/lockup_built-w-flutter/lockup_built-w-flutter_solid.png new file mode 100644 index 00000000000..4bc67f44f4c Binary files /dev/null and b/sites/www/content/brand/assets/flutter-brand-assets/lockup_built-w-flutter/lockup_built-w-flutter_solid.png differ diff --git a/sites/www/content/brand/assets/flutter-brand-assets/lockup_built-w-flutter/lockup_built-w-flutter_solid.svg b/sites/www/content/brand/assets/flutter-brand-assets/lockup_built-w-flutter/lockup_built-w-flutter_solid.svg new file mode 100644 index 00000000000..e4c5bb8db04 --- /dev/null +++ b/sites/www/content/brand/assets/flutter-brand-assets/lockup_built-w-flutter/lockup_built-w-flutter_solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sites/www/content/brand/assets/flutter-brand-assets/lockup_built-w-flutter/lockup_built-w-flutter_wht shaded.png b/sites/www/content/brand/assets/flutter-brand-assets/lockup_built-w-flutter/lockup_built-w-flutter_wht shaded.png new file mode 100644 index 00000000000..41e4504bc57 Binary files /dev/null and b/sites/www/content/brand/assets/flutter-brand-assets/lockup_built-w-flutter/lockup_built-w-flutter_wht shaded.png differ diff --git a/sites/www/content/brand/assets/flutter-brand-assets/lockup_built-w-flutter/lockup_built-w-flutter_wht shaded.svg b/sites/www/content/brand/assets/flutter-brand-assets/lockup_built-w-flutter/lockup_built-w-flutter_wht shaded.svg new file mode 100644 index 00000000000..41822c31a0d --- /dev/null +++ b/sites/www/content/brand/assets/flutter-brand-assets/lockup_built-w-flutter/lockup_built-w-flutter_wht shaded.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sites/www/content/brand/assets/flutter-brand-assets/lockup_built-w-flutter/lockup_built-w-flutter_wht.png b/sites/www/content/brand/assets/flutter-brand-assets/lockup_built-w-flutter/lockup_built-w-flutter_wht.png new file mode 100644 index 00000000000..599feaf3f1a Binary files /dev/null and b/sites/www/content/brand/assets/flutter-brand-assets/lockup_built-w-flutter/lockup_built-w-flutter_wht.png differ diff --git a/sites/www/content/brand/assets/flutter-brand-assets/lockup_built-w-flutter/lockup_built-w-flutter_wht.svg b/sites/www/content/brand/assets/flutter-brand-assets/lockup_built-w-flutter/lockup_built-w-flutter_wht.svg new file mode 100644 index 00000000000..f8c1d88e979 --- /dev/null +++ b/sites/www/content/brand/assets/flutter-brand-assets/lockup_built-w-flutter/lockup_built-w-flutter_wht.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_horizontal/lockup_flutter_horizontal.png b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_horizontal/lockup_flutter_horizontal.png new file mode 100644 index 00000000000..cfc0ee42f37 Binary files /dev/null and b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_horizontal/lockup_flutter_horizontal.png differ diff --git a/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_horizontal/lockup_flutter_horizontal.svg b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_horizontal/lockup_flutter_horizontal.svg new file mode 100644 index 00000000000..211d92f2027 --- /dev/null +++ b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_horizontal/lockup_flutter_horizontal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_horizontal/lockup_flutter_horizontal_solid.png b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_horizontal/lockup_flutter_horizontal_solid.png new file mode 100644 index 00000000000..427e9093ce6 Binary files /dev/null and b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_horizontal/lockup_flutter_horizontal_solid.png differ diff --git a/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_horizontal/lockup_flutter_horizontal_solid.svg b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_horizontal/lockup_flutter_horizontal_solid.svg new file mode 100644 index 00000000000..a0f5fd36ef7 --- /dev/null +++ b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_horizontal/lockup_flutter_horizontal_solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_horizontal/lockup_flutter_horizontal_wht.png b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_horizontal/lockup_flutter_horizontal_wht.png new file mode 100644 index 00000000000..ee515bea2b7 Binary files /dev/null and b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_horizontal/lockup_flutter_horizontal_wht.png differ diff --git a/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_horizontal/lockup_flutter_horizontal_wht.svg b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_horizontal/lockup_flutter_horizontal_wht.svg new file mode 100644 index 00000000000..4869a9b0932 --- /dev/null +++ b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_horizontal/lockup_flutter_horizontal_wht.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_horizontal/lockup_flutter_horizontal_wht_shaded.png b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_horizontal/lockup_flutter_horizontal_wht_shaded.png new file mode 100644 index 00000000000..4c385d00bf6 Binary files /dev/null and b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_horizontal/lockup_flutter_horizontal_wht_shaded.png differ diff --git a/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_horizontal/lockup_flutter_horizontal_wht_shaded.svg b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_horizontal/lockup_flutter_horizontal_wht_shaded.svg new file mode 100644 index 00000000000..25b2a1c2982 --- /dev/null +++ b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_horizontal/lockup_flutter_horizontal_wht_shaded.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_vertical/lockup_flutter_vertical.png b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_vertical/lockup_flutter_vertical.png new file mode 100644 index 00000000000..3dbf14402f9 Binary files /dev/null and b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_vertical/lockup_flutter_vertical.png differ diff --git a/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_vertical/lockup_flutter_vertical.svg b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_vertical/lockup_flutter_vertical.svg new file mode 100644 index 00000000000..d9d6163217d --- /dev/null +++ b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_vertical/lockup_flutter_vertical.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_vertical/lockup_flutter_vertical_solid.png b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_vertical/lockup_flutter_vertical_solid.png new file mode 100644 index 00000000000..e900b548cb4 Binary files /dev/null and b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_vertical/lockup_flutter_vertical_solid.png differ diff --git a/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_vertical/lockup_flutter_vertical_solid.svg b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_vertical/lockup_flutter_vertical_solid.svg new file mode 100644 index 00000000000..5f1860df081 --- /dev/null +++ b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_vertical/lockup_flutter_vertical_solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_vertical/lockup_flutter_vertical_wht shaded.png b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_vertical/lockup_flutter_vertical_wht shaded.png new file mode 100644 index 00000000000..abefe1f1667 Binary files /dev/null and b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_vertical/lockup_flutter_vertical_wht shaded.png differ diff --git a/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_vertical/lockup_flutter_vertical_wht shaded.svg b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_vertical/lockup_flutter_vertical_wht shaded.svg new file mode 100644 index 00000000000..868306b9123 --- /dev/null +++ b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_vertical/lockup_flutter_vertical_wht shaded.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_vertical/lockup_flutter_vertical_wht.png b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_vertical/lockup_flutter_vertical_wht.png new file mode 100644 index 00000000000..51d9f0b03a4 Binary files /dev/null and b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_vertical/lockup_flutter_vertical_wht.png differ diff --git a/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_vertical/lockup_flutter_vertical_wht.svg b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_vertical/lockup_flutter_vertical_wht.svg new file mode 100644 index 00000000000..f8cfeb10539 --- /dev/null +++ b/sites/www/content/brand/assets/flutter-brand-assets/lockup_flutter_vertical/lockup_flutter_vertical_wht.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sites/www/content/brand/assets/ligatures-bad.png b/sites/www/content/brand/assets/ligatures-bad.png new file mode 100644 index 00000000000..3c61f070a5f Binary files /dev/null and b/sites/www/content/brand/assets/ligatures-bad.png differ diff --git a/sites/www/content/brand/assets/ligatures-good.png b/sites/www/content/brand/assets/ligatures-good.png new file mode 100644 index 00000000000..ceb3a820e94 Binary files /dev/null and b/sites/www/content/brand/assets/ligatures-good.png differ diff --git a/sites/www/content/brand/assets/shadow-dash.png b/sites/www/content/brand/assets/shadow-dash.png new file mode 100644 index 00000000000..c90b14a59c6 Binary files /dev/null and b/sites/www/content/brand/assets/shadow-dash.png differ diff --git a/sites/www/content/brand/assets/sizing-spacing-1.png b/sites/www/content/brand/assets/sizing-spacing-1.png new file mode 100644 index 00000000000..a2c0b8769b1 Binary files /dev/null and b/sites/www/content/brand/assets/sizing-spacing-1.png differ diff --git a/sites/www/content/brand/assets/sizing-spacing-2.png b/sites/www/content/brand/assets/sizing-spacing-2.png new file mode 100644 index 00000000000..d943120c181 Binary files /dev/null and b/sites/www/content/brand/assets/sizing-spacing-2.png differ diff --git a/sites/www/content/brand/index.md b/sites/www/content/brand/index.md new file mode 100644 index 00000000000..8f2d0855821 --- /dev/null +++ b/sites/www/content/brand/index.md @@ -0,0 +1,8 @@ +--- +title: Brand +bodyTags: interior brand +description: The Flutter name and logo are trademarks owned by Google. Learn more about representing the Flutter brand. +publishDate: "2022-03-21" +--- + + diff --git a/sites/www/content/community/communities.yaml b/sites/www/content/community/communities.yaml new file mode 100644 index 00000000000..4d7ed9f6dd2 --- /dev/null +++ b/sites/www/content/community/communities.yaml @@ -0,0 +1,40 @@ +# This file contains the source data used to populate the +# list of Flutter communities on the https://flutter.dev/community page. + +- href: "https://discord.com/invite/N7Yshp4" + imgSrc: "images/icons/flutter-discord.png" + imgAlt: "Flutter Discord" + title: "Flutter Discord" + description: "Talk to other Flutter developers about Flutter and share useful resources." +- href: "https://fluttercommunity.dev/joinslack" + imgSrc: "images/icons/community-slack.png" + imgAlt: "Community Slack" + title: "Community Slack" + description: "Chat with GDEs and other Flutter community members" +- href: "https://stackoverflow.com/tags/flutter" + imgSrc: "images/icons/stack-overflow.png" + imgAlt: "Stack Overflow" + title: "Stack Overflow" + description: "Find answers to pressing questions on Stack Overflow" +- href: "https://forum.itsallwidgets.com/" + imgSrc: "images/icons/breaking-changes.png" + imgAlt: "Flutter Forum" + title: "Flutter Forum" + description: "Get Flutter help, discuss the latest updates, and connect with fellow developers on the Flutter forum" +- href: "https://developers.google.com/community/gdg" + imgSrc: "images/icons/gdg.png" + imgAlt: "Google Developer Groups" + title: "Google Developer Groups" + description: "Connect with fellow developers and startups in your area, hear from industry experts, share your skills, and learn" + isFramed: true +- href: "https://groups.google.com/forum/#!forum/flutter-announce" + imgSrc: "images/icons/breaking-changes.png" + imgAlt: "Breaking changes" + title: "Breaking changes" + description: "Get news of breaking changes directly in your inbox" + hasSubscribeButton: true +- href: "https://www.reddit.com/r/FlutterDev/" + imgSrc: "images/icons/reddit.png" + imgAlt: "Reddit" + title: "Reddit" + description: "Join the subreddit for discussions around every aspect of Flutter" diff --git a/sites/www/content/community/images/community-banner.png b/sites/www/content/community/images/community-banner.png new file mode 100644 index 00000000000..17cbac148c1 Binary files /dev/null and b/sites/www/content/community/images/community-banner.png differ diff --git a/sites/www/content/community/images/community-events-meetups.jpg b/sites/www/content/community/images/community-events-meetups.jpg new file mode 100644 index 00000000000..04734a00174 Binary files /dev/null and b/sites/www/content/community/images/community-events-meetups.jpg differ diff --git a/sites/www/content/community/images/community-events-meetups.png b/sites/www/content/community/images/community-events-meetups.png new file mode 100644 index 00000000000..7baaa9ea711 Binary files /dev/null and b/sites/www/content/community/images/community-events-meetups.png differ diff --git a/sites/www/content/community/images/community-events.jpg b/sites/www/content/community/images/community-events.jpg new file mode 100644 index 00000000000..b01d6f7af2c Binary files /dev/null and b/sites/www/content/community/images/community-events.jpg differ diff --git a/sites/www/content/community/images/community-guidelines-bg.jpg b/sites/www/content/community/images/community-guidelines-bg.jpg new file mode 100644 index 00000000000..b0042edcb45 Binary files /dev/null and b/sites/www/content/community/images/community-guidelines-bg.jpg differ diff --git a/sites/www/content/community/images/flutter-gdes.jpg b/sites/www/content/community/images/flutter-gdes.jpg new file mode 100644 index 00000000000..7246a359f53 Binary files /dev/null and b/sites/www/content/community/images/flutter-gdes.jpg differ diff --git a/sites/www/content/community/images/flutteristas.jpg b/sites/www/content/community/images/flutteristas.jpg new file mode 100644 index 00000000000..5a5582fa483 Binary files /dev/null and b/sites/www/content/community/images/flutteristas.jpg differ diff --git a/sites/www/content/community/images/icons/breaking-changes.png b/sites/www/content/community/images/icons/breaking-changes.png new file mode 100644 index 00000000000..bae3d15f98f Binary files /dev/null and b/sites/www/content/community/images/icons/breaking-changes.png differ diff --git a/sites/www/content/community/images/icons/community-slack.png b/sites/www/content/community/images/icons/community-slack.png new file mode 100644 index 00000000000..f17faa13224 Binary files /dev/null and b/sites/www/content/community/images/icons/community-slack.png differ diff --git a/sites/www/content/community/images/icons/flutter-discord.png b/sites/www/content/community/images/icons/flutter-discord.png new file mode 100644 index 00000000000..13f969f0cf9 Binary files /dev/null and b/sites/www/content/community/images/icons/flutter-discord.png differ diff --git a/sites/www/content/community/images/icons/flutteristas-slack.png b/sites/www/content/community/images/icons/flutteristas-slack.png new file mode 100644 index 00000000000..5bf7d7f5f4c Binary files /dev/null and b/sites/www/content/community/images/icons/flutteristas-slack.png differ diff --git a/sites/www/content/community/images/icons/gdg.png b/sites/www/content/community/images/icons/gdg.png new file mode 100644 index 00000000000..8bd52d9e31f Binary files /dev/null and b/sites/www/content/community/images/icons/gdg.png differ diff --git a/sites/www/content/community/images/icons/google-group.png b/sites/www/content/community/images/icons/google-group.png new file mode 100644 index 00000000000..c53d2f4a8bf Binary files /dev/null and b/sites/www/content/community/images/icons/google-group.png differ diff --git a/sites/www/content/community/images/icons/hashnode.png b/sites/www/content/community/images/icons/hashnode.png new file mode 100644 index 00000000000..c90cbf2f4f1 Binary files /dev/null and b/sites/www/content/community/images/icons/hashnode.png differ diff --git a/sites/www/content/community/images/icons/reddit.png b/sites/www/content/community/images/icons/reddit.png new file mode 100644 index 00000000000..b2ce6522a96 Binary files /dev/null and b/sites/www/content/community/images/icons/reddit.png differ diff --git a/sites/www/content/community/images/icons/stack-overflow.png b/sites/www/content/community/images/icons/stack-overflow.png new file mode 100644 index 00000000000..8f4ac3b2aa4 Binary files /dev/null and b/sites/www/content/community/images/icons/stack-overflow.png differ diff --git a/sites/www/content/community/images/icons/uxr-research.png b/sites/www/content/community/images/icons/uxr-research.png new file mode 100644 index 00000000000..9eaf2ca190d Binary files /dev/null and b/sites/www/content/community/images/icons/uxr-research.png differ diff --git a/sites/www/content/community/images/meetup-groups.jpg b/sites/www/content/community/images/meetup-groups.jpg new file mode 100644 index 00000000000..8f098b67b6a Binary files /dev/null and b/sites/www/content/community/images/meetup-groups.jpg differ diff --git a/sites/www/content/community/index.md b/sites/www/content/community/index.md new file mode 100644 index 00000000000..d0e4707864b --- /dev/null +++ b/sites/www/content/community/index.md @@ -0,0 +1,8 @@ +--- +title: Community +bodyTags: interior community +description: Find Flutter community anywhere. Join developers around the world making Flutter even better. +publishDate: "2021-10-21" +--- + + diff --git a/sites/www/content/consultants/data/partners.yaml b/sites/www/content/consultants/data/partners.yaml new file mode 100644 index 00000000000..bf55565e0ab --- /dev/null +++ b/sites/www/content/consultants/data/partners.yaml @@ -0,0 +1,1138 @@ +# This file contains the source data for the Flutter consultants directory. +# +# Don't directly open PRs with additions to this list. +# +# If your company is interested in being a listed consultant, +# please visit the "Become a Flutter consultant" link +# at the top of https://flutter.dev/consultants. + +- title: "Very Good Ventures" + summary: "VGV is a full service consultancy that works with the biggest enterprises and the most impactful startups to design, build, and scale successful software experiences. As early pioneers and world leaders in Flutter, VGV helps its clients do more with the resources available, reach any screen from a single codebase, and implement best practices for long-term growth." + card: "images/third_party/partners/VGV.png" + external_url: "https://verygood.ventures/" + options_location: + - "North America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: true +- title: "Rebel App Studio" + summary: "Rebel App Studio by Codemate is a prominent Flutter Consultancy company. Currently, we are collaborating with renowned brands such as Burger King and Taco Bell to develop top-tier applications. As a Nordic Creative Tech agency, we are equipped with a team of 100 world-class senior software developers and designers. Our clientele includes prestigious names like Netflix, Singapore Airlines, and Google." + card: "images/third_party/partners/Rebel_App_Studio.png" + external_url: "https://rebelappstudio.com/" + options_location: + - "Europe" + options_customer_size: + - "Enterprise" + options_GCP_partner: false +- title: "LeanCode" + summary: "We consult, design and build great products using Flutter for scales-ups and enterprises with the shortest possible time-to-market." + card: "images/third_party/partners/Lean_Code.png" + external_url: "https://leancode.co/technologies/flutter" + options_location: + - "Europe" + options_customer_size: + - "Small-to-medium Business" + options_GCP_partner: false +- title: "Somnio" + summary: "Somnio Software is a Flutter Development Company specializing in developing multiplatform digital solutions. We offer nearshore services for Full Product Development & Staff Augmentation." + card: "images/third_party/partners/Somnio.png" + external_url: "https://somniosoftware.com/why-flutter" + options_location: + - "South America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "L+R" + summary: "L+R is an international Design and Technology Studio and boutique Strategy Consulting Firm. Maximizing utility with the balance of Strategy + Aesthetics." + card: "images/third_party/partners/LR.png" + external_url: "https://levinriegner.com/integrated-offering/flutter-development" + options_location: + - "North America" + options_customer_size: + - "Enterprise" + options_GCP_partner: false +- title: "Accenture" + summary: "Accenture is a global professional services company that helps the world’s leading businesses, governments and other organizations build their digital core, optimize their operations, accelerate revenue growth and enhance citizen services—creating tangible value at speed and scale. We are a talent and innovation led company with 732,000 people serving clients in more than 120 countries." + card: "images/third_party/partners/Accenture.png" + external_url: "https://www.accenture.com/us-en/services/software-platforms/accenture-google-cloud-business-group" + options_location: + - "North America" + options_customer_size: + - "Enterprise" + options_GCP_partner: false +- title: "gskinner.com" + summary: "We collaborate with smart, motivated clients to conceptualize, design, and build world-class interactive experiences." + card: "images/third_party/partners/GSkinner.png" + external_url: "https://flutter.gskinner.com/" + options_location: + - "North America" + options_customer_size: + - "Enterprise" + options_GCP_partner: false +- title: "Baseflow" + summary: "Engineering the Future of Software development. Together with exceptional people, strategy, and design, we create software for every challenge." + card: "images/third_party/partners/Baseflow.png" + external_url: "https://www.baseflow.com/flutter" + options_location: + - "Europe" + options_customer_size: + - "Enterprise" + options_GCP_partner: false +- title: "Theodo Apps" + summary: "Mobile apps people love. Design and development of custom mobile applications." + card: "images/third_party/partners/Theodo_apps.png" + external_url: "https://www.bam.tech/en/expertise/flutter" + options_location: + - "Europe" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Superformula Corporation" + summary: "We are digital experts driven by the passion needed to accelerate and transform your business." + card: "images/third_party/partners/Superformula_1.png" + external_url: "https://www.superformula.com/services/flutter/" + options_location: + - "North America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Black Airplane" + summary: "Whether you're a founder with a big idea or an industry leader with a big need for change, we blend deep technical expertise with uncommon creativity to help you create a product that matches your business needs. If you're looking to streamline your business processes, enhance user experiences, or bring your digital ideas to life, we're here to pilot your vision to victory." + card: "images/third_party/partners/Black_Airplane.png" + external_url: "https://blackairplane.com/partners/flutter" + options_location: + - "North America" + options_customer_size: + - "Small-to-medium Business" + options_GCP_partner: false +- title: "Merixstudio" + summary: "We build and modernize enterprise Flutter apps across mobile, web, and connected devices - consulting, design, and engineering in one team. 25+ years in business. 100+ experts. ISO 27001 & 9001 certified. Google-trusted Flutter Consultant. Clutch #1 in Poland." + card: "images/third_party/partners/Merix_Studio.png" + external_url: "https://www.merixstudio.com/development/flutter" + options_location: + - "Europe" + - "North America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "glueglue" + summary: "We are a digital product agency specializing in turning the most complex and ambitious ideas into web and mobile apps that are not only beautiful but also incredibly user-friendly. Our mission is to create digital products that enhance people's lives. Our approach is straightforward and effective. We design solutions based on real needs and behaviors of individuals." + card: "images/third_party/partners/glueglue.png" + external_url: "https://www.glueglue.com/en/services/sviluppo-applicazioni-web-e-mobile-native-con-flutter" + options_location: + - "Europe" + options_customer_size: + - "Startup" + options_GCP_partner: false +- title: "Solid Software" + summary: "We build secure, complex, and well-designed Flutter mobile and web applications. Flutter Early Adopters from 2018." + card: "images/third_party/partners/Solid.png" + external_url: "https://solid.software" + options_location: + - "North America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Codigee" + summary: "With us, your app development is in daring hands. Don't worry, we've got this! Expect excellence." + card: "images/third_party/partners/Frame_18.png" + external_url: "https://codigee.com/services" + options_location: + - "Europe" + options_customer_size: + - "Small-to-medium Business" + options_GCP_partner: false +- title: "Walturn" + summary: "At Walturn our mission is to make technology more accessible for young startups in the impact driven space to help them build faster and efficiently using Flutter." + card: "images/third_party/partners/Walturn.png" + external_url: "https://www.walturn.com/" + options_location: + - "North America" + options_customer_size: + - "Startup" + options_GCP_partner: false +- title: "Miquido" + summary: "Miquido is a full-service software development company that enables industry leaders to tackle business challenges with 360° digital acceleration services: Cross-Platform Web & Mobile Development, AI Consultancy, Product Design and Strategy." + card: "images/third_party/partners/Miquido.png" + external_url: "https://www.miquido.com/flutter-development-company/" + options_location: + - "Europe" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Sunflower Lab" + summary: "Sunflower Lab is a mobile app development company delivering cutting-edge, enterprise-grade mobile applications for Android and iPhone." + card: "images/third_party/partners/Sunflower_Lab.png" + external_url: "https://www.thesunflowerlab.com/hire-flutter-developers/" + options_location: + - "North America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Dribba" + summary: "Dribba is a Barcelona-based mobile technology consultant specializing in user-centric, high-quality software products developed with Flutter. We have been partnering with brands and startups since 2012 to digitalize their workflows and create impactful products." + card: "images/third_party/partners/Dribba.png" + external_url: "https://www.dribba.com/desarrollo-apps-flutter-barcelona" + options_location: + - "Europe" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Arch" + summary: "Since our founding in 2005, we have built a reputation for designing and developing high quality, innovative software for startups and established brands that offer their end-users the best possible experience." + card: "images/third_party/partners/Arch.png" + external_url: "https://wearearch.com/services-flutter" + options_location: + - "Europe" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: true +- title: "Hedgehog Lab" + summary: "Hedgehog lab is a human-centered global tech consultancy. Our experts in UXR, UI/UX, engineering, cloud, & data science partner to deliver custom app development and digital transformation services. With 15+ years experience, our team have worked for industry leaders including AJ Bell, Deliveroo, Kodak Alaris and Tesco Bank. Our labs are located in Newcastle Upon Tyne, York, Boston and Sofia." + card: "images/third_party/partners/Hedgehog_Lab.png" + external_url: "https://netsells.co.uk/services/flutter-app-development" + options_location: + - "Europe" + options_customer_size: + - "Enterprise" + options_GCP_partner: false +- title: "Infinum" + summary: "Infinum delivers high-end digital solutions to global clients ranging from venture backed start-ups to global enterprises across various industry verticals. We define, design, build, and scale products for mobile and web that grow businesses and empower people." + card: "images/third_party/partners/Infinum.png" + external_url: "https://infinum.com/services/engineering/flutter/" + options_location: + - "Europe" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "PHNTM" + summary: "We help established corporations to build digital, multi-platform apps. We turn your idea into a real product." + card: "images/third_party/partners/phntm.png" + external_url: "https://phntm.xyz/" + options_location: + - "Europe" + options_customer_size: + - "Enterprise" + options_GCP_partner: false +- title: "Zero One Group" + summary: "We empower companies through expertise, precision and passion in software development." + card: "images/third_party/partners/ZeroOneGroup.png" + external_url: "https://www.zero-one-technology.com/" + options_location: + - "Asia" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Krootl" + summary: "Krootl is a full-cycle Flutter app development agency with a primary focus on creating digital solutions for the healthcare, financial, wellness, and retail industries. We design, develop, and launch web and mobile apps that reflect business needs and generate revenue." + card: "images/third_party/partners/Krootl.png" + external_url: "https://www.krootl.com/" + options_location: + - "Europe" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Antino" + summary: "We are product development and digital transformation company, united with the mission: to transform." + card: "images/third_party/partners/Antino.png" + external_url: "https://www.antino.com/mobile-app-development-company" + options_location: + - "Asia" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Snapp X" + summary: "We understand the importance of speed in today's digital world and develop engaging apps for any screen." + card: "images/third_party/partners/SnappX.png" + external_url: "https://www.snappx.io" + options_location: + - "Europe" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Chili Labs" + summary: "We've made mobile apps for the past 7 years, with Flutter, Kotlin and SwiftUI. We have a team of 25 mobile developers located in Riga, Latvia." + card: "images/third_party/partners/Chili.png" + external_url: "https://chililabs.io/services/development/flutter" + options_location: + - "Europe" + options_customer_size: + - "Small-to-medium Business" + options_GCP_partner: false +- title: "iteo" + summary: "iteo is an international digital product studio founded in Poland. We offer business, technical and creative services to deliver digital products and experiences at scale. Our 12 years experience allows us to reveal the true digital potential of business models and drive digital transformation from within organizations." + card: "images/third_party/partners/Iteo.png" + external_url: "https://iteo.com/competences/mobile/flutter/" + options_location: + - "Europe" + options_customer_size: + - "Enterprise" + options_GCP_partner: false +- title: "OTAKOYI" + summary: "For over the decade OTAKOYI designs and builds software products for Startups, Scaleups, and Industry Giants worldwide. Our main goal is to help businesses succeed by delivering digital products of world-class standard, made up by the best engineering teams from Eastern Europe. We are proud of being trusted by more than 150 companies from different parts of the world. We are not just one more outsourcing company, but a trusted technical partner who you can rely on." + card: "images/third_party/partners/-_Eugene_Martseniuk.png" + external_url: "https://otakoyi.software/services/flutter" + options_location: + - "Europe" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Integrated Computer Solutions" + summary: "At the intersection of custom software development, engineering and UX design, Integrated Computer Solutions (ICS) creates sophisticated embedded touchscreen, voice and gesture-powered smart devices and products for global companies." + card: "images/third_party/partners/ICS.png" + external_url: "https://www.ics.com/technologies/flutter" + options_location: + - "Europe" + - "North America" + - "South America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Apexive" + summary: "Top-notch software development for startups. In weeks, not months." + card: "images/third_party/partners/Saiful_Islam.png" + external_url: "https://apexive.com" + options_location: + - "Europe" + options_customer_size: + - "Startup" + options_GCP_partner: false +- title: "Zühlke Engineering AG" + summary: "Zühlke is a global innovation service provider. We empower ideas and create new business models by developing services and products based on new technologies – from initial vision through development, deployment, production, and beyond." + card: "images/third_party/partners/Zuhlke.png" + external_url: "https://www.zuehlke.com/en/expertise/digital-experience" + options_location: + - "Europe" + options_customer_size: + - "Enterprise" + options_GCP_partner: false +- title: "Unlock'd" + summary: "Unlock'd specialises in 'all screen applications'. With the power of Dart & Flutter we develop for any screen. With our clients we aim to create business value by releasing new software versions in short iterations." + card: "images/third_party/partners/Unlockd.png" + external_url: "https://www.unlockd.be" + options_location: + - "Europe" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "intent" + summary: "intent is a team of business-savvy geeks that love treating projects as their own - we have built and scaled products across all stages of development. From initial R&D and prototyping to proof of concept and MVP - we get your product launched and on the market while helping you navigate any challenges along the way." + card: "images/third_party/partners/intent.png" + external_url: "https://withintent.com/flutter" + options_location: + - "Europe" + - "North America" + - "Oceania" + options_customer_size: + - "Small-to-medium Business" + options_GCP_partner: false +- title: "Appventurez Mobitech Pvt Ltd" + summary: "We provide powerful product development solutions blended with state of-the-art technology to transform ideas into legacies. Redefining product development with agile services, a customer-first approach, and on-time delivery mechanisms across industries. We transform ideas into realities by providing end-to-end product development solutions from strategizing to production." + card: "images/third_party/partners/Appventurez.png" + external_url: "https://www.appventurez.com/flutter-app-development" + options_location: + - "Asia" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "FiveDotTwelve" + summary: "FiveDotTwelve is an app development company focusing on close cooperation with clients and individual approach to every project. We are passionate about delivering the highest quality products to our clients. We work hard to understand your business needs and then rapidly develop and implement fit-for-purpose solutions." + card: "images/third_party/partners/FiveDotTwelve.png" + external_url: "https://fivedottwelve.com/services/mobile-app-development/flutter-app-development/" + options_location: + - "Europe" + options_customer_size: + - "Startup" + options_GCP_partner: false +- title: "NextApps" + summary: "NextApps - A good app solves the problem." + card: "images/third_party/partners/Next_Apps_-_Lukasz_Lojerczuk.png" + external_url: "https://www.nextapps.co/" + options_location: + - "Europe" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Atomic Robot" + summary: "Atomic Robot is a mobile app design and development agency headquartered in Cincinnati. We've helped companies from startups to enterprise bring exceptional mobile apps to market." + card: "images/third_party/partners/atomic_robot.png" + external_url: "https://atomicrobot.com/services/" + options_location: + - "North America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: true +- title: "Never Inc." + summary: "We aim to create a new world and a better future through application development." + card: "images/third_party/partners/Shohei_Nakagawa.png" + external_url: "https://neverjp.com/contact/" + options_location: + - "Asia" + options_customer_size: + - "Small-to-medium Business" + options_GCP_partner: false +- title: "Code Heroes" + summary: "Code Heroes is a Queensland based software development agency that specialise in designing and developing applications with Flutter. Since 2011 Code Heroes have a history of delivering bespoke, business-critical applications to clients across Australia, most recently developing the QLD Digital License application for the Department of Transport and Main Roads. The Code Heroes team are located in Queensland, Australia and service clients in APAC." + card: "images/third_party/partners/Codeheroes.png" + external_url: "https://www.codeheroes.com.au/flutter-developers-australia" + options_location: + - "Oceania" + options_customer_size: + - "Enterprise" + options_GCP_partner: true +- title: "Innoventix Solutions" + summary: "We are a Flutter exclusive mobile app development and Microsoft 365 cloud solutions agency. We help small, medium and enterprise businesses to bring their business process ideas to mobile first apps." + card: "images/third_party/partners/Innoventix.png" + external_url: "https://innoventixsolutions.com/flutter-app-development/" + options_location: + - "North America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "This Might Work" + summary: "As a Digital Product Studio, we partner with startups and brands to transform bold ideas into digital products and services." + card: "images/third_party/partners/ThisMightWork.png" + external_url: "https://www.thismightwork.co/flutter" + options_location: + - "Europe" + options_customer_size: + - "Startup" + options_GCP_partner: true +- title: "theTribe" + summary: "We're building apps like a design studio, where the user is in the center of our approach to make sure we reach your target with success once the app's published." + card: "images/third_party/partners/The_Tribe.png" + external_url: "https://thetribe.io/metier-flutter/" + options_location: + - "Europe" + options_customer_size: + - "Small-to-medium Business" + options_GCP_partner: false +- title: "FF.Next" + summary: "We are a digital product design agency creating beautifully-crafted & highly functional mobile and web applications in more than 20 countries. We’ve been creating & implementing design-driven mobile banking products from Singapore through Central-Eastern Europe to the UK already for 10+ banks and 20+ fintechs in the past 5 years." + card: "images/third_party/partners/ff.next.png" + external_url: "https://www.ffnext.io/flutter" + options_location: + - "Europe" + options_customer_size: + - "Startup" + options_GCP_partner: false +- title: "Paulonia" + summary: "We are a human team with skills in design and development of cross-platform apps in Flutter with the vision of being a technological reference in Latin America." + card: "images/third_party/partners/Paulonia.png" + external_url: "https://paulonia.dev/development" + options_location: + - "South America" + options_customer_size: + - "Small-to-medium Business" + options_GCP_partner: false +- title: "DiUS" + summary: "DiUS is a technology consultancy with leading capabilities in digital transformation and product development. Our team across Australia and New Zealand leverage specialist expertise in cloud, data, application development, mobile, experience design, IoT and machine learning." + card: "images/third_party/partners/Dius.png" + external_url: "https://dius.com.au/flutter" + options_location: + - "Oceania" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "icapps" + summary: "icapps is a digital product agency that started with the first Belgian made iOS apps and quickly grew into a company that covers all your custom software needs from strategy, design to development. icapps aims to be at the forefront in everything Flutter in Belgium." + card: "images/third_party/partners/William_Verhaeghe.png" + external_url: "https://icapps.com/development/mobile/flutter" + options_location: + - "Europe" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Nomtek" + summary: "Nomtek is a software development agency delivering impactful mobile and XR apps for change makers. We leverage 14 years of experience to build digital products that people love to use." + card: "images/third_party/partners/Marcin_Durawa.png" + external_url: "https://www.nomtek.com/mobile-development/flutter" + options_location: + - "Europe" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "F22 Labs" + summary: "We are a product design and development studio empowering businesses with cutting-edge, high-impact software solutions that fuel growth and drive success. Whether it's healthcare, finance, retail, or any other sector, we have led numerous digital transformations. If you have a problem, we would love to learn more and assist you in finding a solution." + card: "images/third_party/partners/f22_labs.png" + external_url: "https://www.f22labs.com/flutter-development/" + options_location: + - "Asia" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Momentum" + summary: "Momentum is a digital health agency recognized for delivering innovative, secure, and scalable software solutions. Since 2016, we have been the trusted partner of HealthTech startups and global leaders, helping them overcome complex challenges. Our commitment to compliance, including adherence to ISO 13485 standards, has earned us recognition in the FT 1000 and Forbes Diamond Award." + card: "images/third_party/partners/Momentum.png" + external_url: "https://www.themomentum.ai/services/product-development-and-growth/mobile-app-development" + options_location: + - "Europe" + options_customer_size: + - "Small-to-medium Business" + options_GCP_partner: false +- title: "Approachable Geek" + summary: "Whether you are looking to improve your company's internal processes, or have a million-dollar app idea, we are the Approachable Geeks you have been looking for. We're Approachable (easy to talk to) and Geeks (technically proficient), and the combination of those means that you get clear communication throughout the process and killer code." + card: "images/third_party/partners/approachable_geek_-_Garrett_Barlocker.png" + external_url: "https://approachablegeek.com/services/flutter" + options_location: + - "North America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Loomery" + summary: "Loomery is a team of makers who partner with you to learn at pace, launch with impact and lead your organisation forward. Our making-led strategic approaches deliver solutions to help your organisation go further and accelerate towards your product future in days or weeks, not months or years. We're cross-platform advocates who have spent the last four years putting Flutter through its paces." + card: "images/third_party/partners/Loomery.png" + external_url: "https://www.loomery.com/loomery-x-flutter" + options_location: + - "Europe" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Reactree" + summary: "Reactree is a rapidly growing technology company that empowers people to believe that sky is indeed the limit. We craft attractive mobile & web app experiences driven by design, strategy and technology." + card: "images/third_party/partners/Reactree.png" + external_url: "https://reactree.com/flutter-development-services/" + options_location: + - "Asia" + options_customer_size: + - "Small-to-medium Business" + options_GCP_partner: false +- title: "Netglade" + summary: "Netglade is a software agency specializing in Flutter app development. We create, maintain and improve apps that are used by over a million users every day." + card: "images/third_party/partners/Netglade.png" + external_url: "https://www.netglade.cz/flutter" + options_location: + - "Europe" + options_customer_size: + - "Small-to-medium Business" + options_GCP_partner: false +- title: "GeekyAnts" + summary: "GeekyAnts provides end-to-end app development and consultation services. Powered by our passionate Flutter team, we solve problems for Small, Medium, and Enterprise companies. Our expertise is building custom internal software, B2B and B2C software, web and mobile applications, and MVPs." + card: "images/third_party/partners/GeekyAnts.png" + external_url: "https://geekyants.com/hire-flutter-developers/" + options_location: + - "Asia" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Mokutan Technologies Ltd" + summary: "We are a UK based Flutter development agency. Specialising in building custom B2B SaaS and internal business applications." + card: "images/third_party/partners/Mokutan.png" + external_url: "https://www.mokutan.io/flutter" + options_location: + - "Europe" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "GITS.id" + summary: "We thrive to develop applications for good. To empower people, to increase productivity, to ease your daily life. Our applications are to get it simple." + card: "images/third_party/partners/gits.id.png" + external_url: "https://gits.id/" + options_location: + - "Asia" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: true +- title: "Pentagon Co., Ltd." + summary: '"Pentagon, Inc. is a software company based in Tokyo that specializes in app development using Flutter. The company also shares Flutter technical knowledge on YouTube and its blog."' + card: "images/third_party/partners/Pentagon.png" + external_url: "https://pentagon.tokyo/flutter/" + options_location: + - "Asia" + options_customer_size: + - "Startup" + options_GCP_partner: false +- title: "Supercharge" + summary: "At Supercharge, we are your innovation partner to turn disruption into opportunity. With our 200+ digital experts in London, New York, Helsinki, Amsterdam, Vienna, and Budapest, we work with our clients to create transformative digital solutions. We design, engineer, and scale digital products to make your business fit for the future." + card: "images/third_party/partners/Supercharge.png" + external_url: "https://insights.supercharge.io/book-tech-evaluation-flutter" + options_location: + - "Europe" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "ArcTouch" + summary: "ArcTouch creates lovable apps, websites, and digital experiences to help companies forge meaningful connections with their customers." + card: "images/third_party/partners/ArcTouch.png" + external_url: "https://arctouch.com/flutter" + options_location: + - "North America" + options_customer_size: + - "Enterprise" + options_GCP_partner: false +- title: "OakTree Apps" + summary: "OakTree Apps is a fully remote company that works with small and medium enterprises on greenfield projects using Flutter for mobile apps. We are a team of 23, 18 of them being engineers (11 for Flutter/mobile and 7 for backend technologies)." + card: "images/third_party/partners/Pratik_Khivesara.png" + external_url: "https://oaktreeapps.com/services/flutter-app-development" + options_location: + - "North America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Mr. Milu" + summary: "Independent Digital Agency with integral services: digital design, development, user experience, data analytics and digital marketing" + card: "images/third_party/partners/mr_milu.png" + external_url: "https://mrmilu.com/en/flutter" + options_location: + - "Europe" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "In The Pocket" + summary: "In The Pocket is a digital product studio. We take you from ideation to a full-blown digital experience, ready to hit the market and create value for your business." + card: "images/third_party/partners/Inthepocket.png" + external_url: "https://tech.inthepocket.com/technology/flutter" + options_location: + - "Europe" + options_customer_size: + - "Enterprise" + options_GCP_partner: false +- title: "Plangora Limited" + summary: "Founded in 2016, Plangora is driven by a passion for harnessing the power of cutting-edge technology to deliver exceptional results for our clients. With a focus on custom-tailored solutions, we have successfully transformed the visions of over 100 companies into tangible products and comprehensive IT solutions within just 7 years." + card: "images/third_party/partners/Plangora.png" + external_url: "https://www.plangora.com/flutter" + options_location: + - "Asia" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "JIITAK Inc." + summary: "Our company is a pioneering Flutter developer, harnessing its versatility to craft seamless applications across Android, iOS, web, Windows, MacOS, and iPad with a single codebase. Leveraging our proprietary frameworks and packages, we accelerate development, delivering unparalleled speed and user experiences indistinguishable from native apps." + card: "images/third_party/partners/Jiitaik.png" + external_url: "https://www.jiitak.co.jp/services/flutter" + options_location: + - "North America" + options_customer_size: + - "Small-to-medium Business" + options_GCP_partner: false +- title: "Incibit GmbH" + summary: "We are an app development agency focusing solely on Flutter app development. We also provide flutter consultancy services and also do Flutter trainings with our clients." + card: "images/third_party/partners/Incibit.png" + external_url: "https://incibit.dev/flutter-entwicklung/" + options_location: + - "Europe" + options_customer_size: + - "Small-to-medium Business" + options_GCP_partner: true +- title: "NetForemost, Inc" + summary: "Our main objective is to build the most outstanding and robust software development teams in Latin America for U.S companies looking for first class technological solutions." + card: "images/third_party/partners/Netforemost_logo.png" + external_url: "https://netforemost.com/technologies/flutter/" + options_location: + - "Europe" + - "North America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "WebReinvent Technologies Pvt. Ltd." + summary: "WebReinvent Technologies Pvt. Ltd. is a software engineering company founded in 2010, working with global clients to build modern web and mobile solutions. We deliver end-to-end product development—from MVPs to scalable, user-centric digital platforms. Our expertise spans API design, multi-tenant SaaS systems, real-time applications, and Flutter-based cross-platform mobile apps with consistent UI, secure architecture, performant builds, and AI-driven capabilities. We are the only official partner in Asia for Flutter, Laravel, Vue, Nuxt, and Builder.io, reflecting our strong engineering standards and ecosystem leadership." + card: "images/third_party/partners/WebReinvent_logo.png" + external_url: "https://webreinvent.com/technologies/mobility/flutter-app-development" + options_location: + - "Asia" + - "Europe" + - "North America" + - "South America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "iglu.dev" + summary: "We help product and development teams write code for digital products and software. We use our unique cross-platform frameworks so you can deploy quality software on time." + card: "images/third_party/partners/Iglu_logo.png" + external_url: "https://iglu.dev" + options_location: + - "Europe" + - "North America" + - "South America" + options_customer_size: + - "Startup" + options_GCP_partner: false +- title: "ThinkUp" + summary: "A LATAM-based digital product studio specialized in Flutter for banks, fintechs, and neobanks. We design, build, and scale secure, high-performance mobile apps end-to-end—leveraging Shorebird, Server-driven UI, analytics, and AI to drive activation and growth. We handle strategy, UX/UI, development, QA, and ongoing optimization for regulated financial products." + card: "images/third_party/partners/ThinkUp_logo.png" + external_url: "https://thinkupsoft.com/en/services/flutter-consultants" + options_location: + - "Europe" + - "South America" + options_customer_size: + - "Enterprise" + options_GCP_partner: false +- title: "Koderead Solutions" + summary: "An end-to-end digital solutions company specializing in Flutter app development, e-business platforms, and web solutions. We leverage Flutter to build high-performance, cross-platform mobile apps with a unified codebase—helping you gain a competitive advantage and move confidently toward a successful digital future." + card: "images/third_party/partners/Koderead_logo.png" + external_url: "https://koderead.com" + options_location: + - "Africa" + - "Asia" + - "Europe" + - "North America" + - "Oceania" + - "South America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Bacancy Technology" + summary: "A premier Mobile App development company since 2011. We have a skilled pool of 1050+ developers with expertise in multiple technologies. From startups to Fortune 500 companies partnering with brands worldwide, we deliver fast, high-quality, cost-effective solutions at affordable rates. Get quick access to Flutter developers with 4-6 years of experience" + card: "images/third_party/partners/Bacancy_logo.png" + external_url: "https://www.bacancytechnology.com/hire-flutter-developer" + options_location: + - "Asia" + - "Europe" + - "North America" + - "Oceania" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Xmartlabs" + summary: "Xmartlabs is a digital product studio that helps US companies build and scale web and mobile products with senior teams across product, design, engineering, DevOps, and AI. Our work spans Fortune 500 brands and top-tier VC-backed startups." + card: "images/third_party/partners/Xmartlabs_logo.png" + external_url: "https://www.xmartlabs.com/flutter-services?utm_source=FlutterConsultants&utm_medium=website&utm_campaign=FlutterConsultants&utm_id=FlutterConsultants" + options_location: + - "South America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "impaktfull" + summary: "impaktfull is a product-focused digital agency specializing in Flutter mobile and web applications. We help brands and organizations turn ideas into impactful products by aligning design, technology, and strategy from first prototype to launch." + card: "images/third_party/partners/Impaktfull_logo.png" + external_url: "https://www.impaktfull.com/flutter-consultant" + options_location: + - "Europe" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "neusta mobile solutions GmbH" + summary: "Supports clients through every phase of the app development lifecycle: From initial product vision and UX conception to scalable Flutter engineering, deployment, and continuous evolution. Through a user-centric approach and uncompromising quality standards, our team delivers future-ready Flutter solutions that stand out." + card: "images/third_party/partners/Neusta_logo.png" + external_url: "https://neusta-ms.de/flutter_en/" + options_location: + - "Europe" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Flutternest" + summary: "Specializes in providing world-class Flutter app development services to businesses looking for innovative, scalable, and cost-effective mobile and web solutions. Our team of expert Flutter developers is dedicated to transforming your vision into reality with cutting-edge technologies and tailor-made solutions, whether you need a simple app or a complex, enterprise-grade mobile platform." + card: "images/third_party/partners/Flutternest_logo.png" + external_url: "https://flutternest.com/hire-flutter-app-developers" + options_location: + - "Asia" + - "Europe" + - "North America" + - "Oceania" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Q agency" + summary: "Q is known for delivering high-quality tech solutions, with a focus on software engineering and tech consultancy. Our team of over 300 engineers across 20 countries works seamlessly to deliver custom software solutions and build long-term partnerships tailored to the unique needs of our global clients." + card: "images/third_party/partners/Qagency_logo.png" + external_url: "https://q.agency/services/engineering/mobile/flutter-development-team/" + options_location: + - "Asia" + - "Europe" + - "North America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Leenspace" + summary: "We are a LATAM-based agency 100% focused on Flutter, specializing in building AI-powered mobile applications." + card: "images/third_party/partners/LeenSpace_logo.png" + external_url: "https://www.leenspace.com?utm_source=Flutter_consultants&utm_medium=web&utm_campaign=flutter_consultants_directory" + options_location: + - "North America" + - "South America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Nagarro SE" + summary: "With 17k+ Nagarrians in 39 countries, Nagarro drives business value and engineering excellence in over 1000 clients globally. We are distinguished by our entrepreneurial, agile, and global character, as well as our CARING values and mindset. We are not trying to emulate the companies of yesterday, we are the company of tomorrow." + card: "images/third_party/partners/Nagarro_logo.png" + external_url: "https://www.nagarro.com/en/services/product-studio/flutter-multi-platform-app-development" + options_location: + - "Africa" + - "Asia" + - "Europe" + - "North America" + - "Oceania" + - "South America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Logika Sarana Teknologi" + summary: "Specializes in using Flutter to create high-performance, visually stunning, and responsive mobile applications tailored to meet the unique needs of your business. Our price for mobile app development services is very competitive compared to the market, while maintaining the highest quality." + card: "images/third_party/partners/Logique_logo.png" + external_url: "https://www.logique.co.id/en/services/mobile-app-dev/flutter.php" + options_location: + - "Asia" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "BOSC Tech Labs" + summary: "BOSC Tech Labs is an early adopter of Flutter since 2019, delivering enterprise-grade, secure, and high-performance cross-platform applications for organizations worldwide. We partner with enterprises to build scalable Flutter solutions featuring complex workflows, role-based access, and data-intensive systems engineered with strong architecture, performance optimization, and long-term maintainability at the core." + card: "images/third_party/partners/Bosc_logo.png" + external_url: "https://bosctechlabs.com/services/flutter-application-development/" + options_location: + - "Europe" + - "North America" + - "Oceania" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "TechAhead Inc" + summary: "A pioneer in custom mobile app development since 2009, TechAhead leverages Flutter to craft fast, scalable, and beautifully designed cross-platform experiences for leading global brands." + card: "images/third_party/partners/Techahead_logo.png" + external_url: "https://www.techaheadcorp.com/services/flutter-app-development-company/" + options_location: + - "Asia" + - "Europe" + - "North America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Octo Technology" + summary: "Through our technological and methodological expertise, we want to be proud of what we achieve for our clients, ranging from startups to multinational companies." + card: "images/third_party/partners/Octo_logo.png" + external_url: "https://publication.octo.com/en/octo-flutter" + options_location: + - "Europe" + options_customer_size: + - "Enterprise" + options_GCP_partner: false +- title: "Cleveroad" + summary: "A cross-platform software development company that leverages Flutter to build high-performing apps for iOS, Android, and web. We help startups and SMBs accelerate time-to-market, streamline costs, and deliver native-like user experiences across industries including FinTech, Logistics, Healthcare, and Education." + card: "images/third_party/partners/Cleveroad_logo.png" + external_url: "https://www.cleveroad.com/services/flutter-app-development/" + options_location: + - "Europe" + - "North America" + - "Oceania" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + options_GCP_partner: false +- title: "Mobitouch" + summary: "A Flutter development studio founded in Poland that helps startups and established companies build beautiful, high-performance mobile apps. We combine hands-on technical expertise with a genuine understanding of what makes products work—whether you're launching something new or scaling an existing app, we've got the experience to help you get there faster and smarter." + card: "images/third_party/partners/Mobitouch_logo.png" + external_url: "https://mobitouch.net/services/flutter-app-development" + options_location: + - "Europe" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "SHAPE" + summary: "A hybrid digital agency where human creativity meets Al-powered automation. Together, we're rewriting the rules for customer experiences, business processes, and digital innovation." + card: "images/third_party/partners/Shape_logo.png" + external_url: "https://shape.agency/leistungen/softwareentwicklung/flutter" + options_location: + - "Europe" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "zeb AI" + summary: "zeb is a leading digital transformation strategy company and AWS Premier, Databricks Select, and ServiceNow Premier Partner that offers customers a holistic product-centric approach by combining strategic planning with a proprietary AI-powered implementation methodology. With 15+ years of experience and a team of more than 1000 technologists, we are committed to harnessing bleeding-edge technologies to provide our clients maximum ROI." + card: "images/third_party/partners/zebAI_logo.png" + external_url: "https://zeb.co/digital-transformation/flutter/" + options_location: + - "Asia" + - "North America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Double Coconut" + summary: "A boutique studio building striking and effective app and web experiences. Not just development -- we also help with UX, design, and making sure your app is a success. Custom development services with competitive pricing with specialties in gamification and games." + card: "images/third_party/partners/doublecoconut_logo.png" + external_url: "https://double.studio/flutter" + options_location: + - "Asia" + - "Europe" + - "North America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "CodeX Lancers" + summary: "CodeX Lancers is a full-cycle digital innovation agency specializing in building beautifully crafted, high-performance mobile applications. Since 2019 We help startups launch faster and support established brands in strengthening and expanding their digital presence. Our team brings strong cross-platform expertise, working across Flutter, FlutterFlow, Xamarin (MAUI), and native technologies such as Kotlin and Swift." + card: "images/third_party/partners/CodeXLancers.png" + external_url: "https://codexlancers.com/services/flutterf-app-development/" + options_location: + - "Africa" + - "Asia" + - "Europe" + - "North America" + - "Oceania" + - "South America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "TELUS Digital" + summary: "The customer experience transformation partner: TELUS Digital is the preferred partner to design, build, and deliver end-to-end, AI-fueled, premium customer experiences for global brands. TELUS Digital has a NPS of 79 among our 600+ clients, with an average client tenure of greater than 9 years, and has built many apps that have topped the iOS App Store and Google Play Store charts." + card: "images/third_party/partners/Telus.png" + external_url: "https://www.telusdigital.com/solutions/web-mobile-and-digital-marketing/mobile-app-web-development-services/flutter" + options_location: + - "Asia" + - "Europe" + - "North America" + - "Oceania" + - "South America" + options_customer_size: + - "Enterprise" + options_GCP_partner: false +- title: "Open Reply" + summary: "Open Reply is a Reply Group company specialized in mobile and digital transformation, delivering end-to-end solutions. It supports enterprises in building scalable, secure, and high-performance digital experiences, combining deep technological expertise with agile delivery and design-driven innovation." + card: "images/third_party/partners/Open-Reply_logo.png" + external_url: "https://www.reply.com/open-reply-italy/en/flutter" + options_location: + - "Europe" + options_customer_size: + - "Enterprise" + options_GCP_partner: false +- title: "fab App Agency" + summary: "fab is a Berlin-based app agency specializing in high-quality mobile app development with Flutter, working with leading German enterprises and ambitious startups. We build high-performance, scalable apps with outstanding UX design, integrating technologies such as AI, IoT, sensor systems and wearables to create future-ready digital products." + card: "images/third_party/partners/Fab_logo.png" + external_url: "https://flutterapps.agency/flutter-app-entwicklung/" + options_location: + - "Europe" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Moonwise" + summary: "We are agent assisted Flutter experts from Sweden, designing and developing beautiful cross-platform apps." + card: "images/third_party/partners/Moonwise_logo.png" + external_url: "https://moonwise.se/" + options_location: + - "Asia" + - "Europe" + - "North America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "TBR Group" + summary: "We help startups and established business evolve through design and development and overcome emerging challenges. We’ll give your product idea an efficient shape and functionality." + card: "images/third_party/partners/TBR-group_LOGO.png" + external_url: "https://tbrgroup.software/" + options_location: + - "Europe" + - "North America" + - "South America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "FlutterLab" + summary: "FlutterLab is one of the first Flutter-focused Software Development companies been developing with Flutter since the first open beta in 2018. We grew up with Flutter-focus, helping worldwide startups and big companies to develop digital products with native performance, faster to the market." + card: "images/third_party/partners/Flutterlab_logo.png" + external_url: "https://flutterlabapps.com/flutter" + options_location: + - "Africa" + - "Asia" + - "Europe" + - "North America" + - "Oceania" + - "South America" + options_customer_size: + - "Startup" + options_GCP_partner: false +- title: "Liquid Studio" + summary: "A Barcelona-based development studio founded in 2016. We specialize in cross-platform mobile apps for iOS and Android using Flutter, delivering projects from concept to App Store. We've built 25+ apps for clients ranging from startups to enterprise brands. We also develop custom web applications with Laravel and premium CMS solutions with Craft CMS." + card: "images/third_party/partners/Liquid_logo.png" + external_url: "https://www.liquidbcn.com/en/technologies/flutter-app-development-barcelona" + options_location: + - "Europe" + - "North America" + - "South America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + options_GCP_partner: false +- title: "Webkul Software Pvt Ltd" + summary: "Is a global IT solutions provider specializing in eCommerce, marketplace, and mobile app development, with strong expertise in Flutter for building scalable, high-performance cross-platform applications. We help businesses accelerate digital transformation through custom development, integrations, and SaaS solutions." + card: "images/third_party/partners/Webkul_logo.png" + external_url: "https://webkul.com/flutter-app-development-services/" + options_location: + - "Africa" + - "Asia" + - "Europe" + - "North America" + - "Oceania" + - "South America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "LANARS AS" + summary: "Is a Norwegian software development company specializing in mobile and web application development, AI solutions, and system integrations for startups and enterprise clients across Europe. With a strong track record of delivering production-grade Flutter applications, we bring both technical depth and product-minded thinking to every engagement." + card: "images/third_party/partners/LANARS_logo.png" + external_url: "https://lanars.com/software-development/mobile-app-development" + options_location: + - "Europe" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Fueled Digital Media" + summary: "Is a premier digital product studio specializing in building high-impact mobile apps, websites, and digital experiences for startups and Fortune 500 brands. We combine strategy, design, and engineering to deliver scalable, user-centric products." + card: "images/third_party/partners/fueled_logo.png" + external_url: "https://fueled.com/flutter/" + options_location: + - "Asia" + - "Europe" + - "North America" + - "Oceania" + - "South America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "AppStarter" + summary: "AppStarter turns ambitious ideas into market-leading apps." + card: "images/third_party/partners/AppStarter_logo.png" + external_url: "https://appstarter.agency/en/technologies/flutter" + options_location: + - "Europe" + - "North America" + - "South America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "7Span" + summary: "Is a digital engineering company specializing in building scalable web and mobile applications, with a strong focus on Flutter-based cross-platform solutions and modern architecture practices." + card: "images/third_party/partners/7span_logo.png" + external_url: "https://7span.com/flutter-consultants" + options_location: + - "Asia" + - "Europe" + - "North America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false +- title: "Flexion Infotech Private Limited" + summary: "Global AI automation and custom software engineering company specializing in scalable mobile and web applications, with strong expertise in Flutter app development." + card: "images/third_party/partners/Flexion_logo.png" + external_url: "https://flexioninfotech.com/services/flutter-development" + options_location: + - "Asia" + - "Europe" + - "North America" + options_customer_size: + - "Startup" + - "Small-to-medium Business" + - "Enterprise" + options_GCP_partner: false \ No newline at end of file diff --git a/sites/www/content/consultants/data/resources.yaml b/sites/www/content/consultants/data/resources.yaml new file mode 100644 index 00000000000..0183ab50bfa --- /dev/null +++ b/sites/www/content/consultants/data/resources.yaml @@ -0,0 +1,33 @@ +# This file contains the source data used to populate the +# "Resources for Flutter consultants" carousel at the +# bottom of the https://flutter.dev/consultants page. +# +# Don't directly open PRs with additions to this list. +# +# If you have a resource you'd like to be listed, +# please open an issue with more information. + +- title: "How IBM Created a Flutter Center of Excellence" + summary: "Learn why and how IBM created a center of excellence with hundreds of Flutter developers." + card: "images/third_party/resources/Bizaia.png" + external_url: "https://blog.flutter.dev/how-ibm-is-creating-a-flutter-center-of-excellence-3c6a3c025441" + background_color: "#027DFD" + button_text: "Read this Story" +- title: "Training Clients on Flutter" + summary: "Learn how VGV created a successful training program to upskill consultants and customers." + card: "images/third_party/resources/Timeline.png" + external_url: "https://verygood.ventures/blog/training-clients-in-flutter" + background_color: "#027DFD" + button_text: "Read this Story" +- title: "How Consultants Build Faster with FlutterFlow" + summary: "Explore the benefits of FlutterFlow, a low-code editor for Flutter apps." + card: "images/third_party/resources/Developer_widget.png" + external_url: "https://medium.com/flutterflow-enterprise/how-flutterflow-helps-consultants-solve-clients-last-mile-of-digital-transformation-b6d8e7d3b49e" + background_color: "#027DFD" + button_text: "Read this Story" +- title: "Build Wonders with Flutter" + summary: "See why Flutter is such a valuable tool for award winning design agencies like gSkinner" + card: "images/third_party/resources/App.png" + external_url: "https://www.youtube.com/watch?v=6IKhXXFFOuw" + background_color: "#027DFD" + button_text: "Watch the video" diff --git a/sites/www/content/consultants/flutter-consultants-terms-of-service.md b/sites/www/content/consultants/flutter-consultants-terms-of-service.md new file mode 100644 index 00000000000..5fb9138d0c5 --- /dev/null +++ b/sites/www/content/consultants/flutter-consultants-terms-of-service.md @@ -0,0 +1,97 @@ +--- +title: Flutter Consultants Terms of Service +layout: consultants-tos +bodyTags: interior partner +description: >- + Terms of service for being included in the Flutter Consultants program. +--- + +### Terms of Service + +Thank you for using Flutter and applying to be included in Flutter's online directory of Flutter consultants or service providers that customers may choose to engage to help develop their Flutter apps. By applying to be listed on the Flutter website as a consultant or service provider, you agree to these terms. These terms DO NOT negate, modify, or alter the terms of services applicable to you as a Flutter user or otherwise applicable to your Flutter credentials or account, except to the extent directly contradictory related to your directory listing on the Flutter website under these terms. All such other terms are otherwise fully applicable, including but not limited to confidentiality, intellectual property, liability, indemnification, and other provisions. + +**PILOT AND AMENDMENTS TO THESE TERMS:** Note the Flutter consultant directory program is a pilot program; we may elect to test, modify, expand, or eliminate this program in its sole discretion and without notice. Additionally, we may and likely will modify these terms from time to time as we gain learnings from the pilot program and grow the program through and after any further growth or non-pilot launch of the program. + +1\. Participation. + +(a) Not Guaranteed. Thank you for applying; we take your application very seriously, but we cannot promise you will be accepted for inclusion as a consultant. Google may, at its sole and exclusive discretion, for any or no reason, elect to include or not include any service provider as a consultant listed on Flutter's website. If you are included, Flutter will make a directory listing which identifies all consultants in a similar manner, using links, thumbnails, or other identifiers of substantially the same size or style, subject to consultant art and similar considerations. + +(b) No Compensation. We will not provide you any compensation for or related to your participation in the consultant directory program. + +(c) Suspension. We may suspend the program or your participation at any time. + +(d) Relationship with your customers. Flutter hopes that, by listing you/your company in the consultant directory on Flutter's website, customers interested in applications built using Flutter will seek out your services to do so; however, in listing you on our site, Flutter makes no representation to potential customers, you, or anyone else that you are a Google/Flutter partner, that you are qualified to perform your services, or that customers will or should find you via our site. We are not part of or responsible for your relationship with any such potential customers, and you shall retain sole and full responsibility for forming and maintaining such relationships and for your conduct and rights related to such relationships. + +(e) Compliance with Laws and Documentation. + +(i) You will comply with all applicable laws in your participation in the program and your use of Flutter and other Google products and services, including laws, policies, and regulations relating to the collection, use, and sharing of information about your users. + +(ii) You will follow all instructions and adhere to all restrictions contained in any program documentation applicable to the program we make available ("Documentation"). All Documentation is incorporated by this reference into these terms. As described in the Documentation and at our sole discretion, You will not use specified Google Products and Services in connection with any application that collects sensitive information (either directly, indirectly, or inferred). + +(f) Export Compliance. In performing your services related to us, the program, or our products and services, you will comply with all applicable export and re-export control laws and regulations, including (a) the Export Administration Regulations ("EAR") maintained by the U.S. Department of Commerce, (b) trade and economic sanctions maintained by the U.S. Treasury Department's Office of Foreign Assets Control, and (c) the International Traffic in Arms Regulations ("ITAR") maintained by the U.S. Department of State. + +2\. Intellectual Property Rights. + +(a) Flutter and the consultant directory program. + +(i) License. You grant us the fully paid-up, royalty-free right to use your logo, trade names, trademarks, and other art or intellectual property you provide in association with the consultant directory program, for the purposes of listing you/your company on the Flutter website as a service provider willing to provide services to third parties using Flutter. We recognize you own the rights to all such intellectual property and simply provide us a license via these terms. + +(ii) Our ownership. Except as recognized in section (i) above, as between you and us, we own and retain all right, title, and interest in Flutter, the Flutter website, the program, and any other art or elements which may exist thereon or relate to or support the program and your listing on the website. Nothing in this agreement changes the IP ownership provisions regarding our intellectual property contained in the terms applicable to your use of Flutter. + +(b) Feedback. We may ask you to provide feedback regarding Flutter, Google, and/or the consultant directory program ("Feedback"). You are not required to provide Feedback, but if you do, the Feedback must (i) be truthful; (ii) originate only from you; and (iii) not contain any third party's Confidential Information. We may use Feedback without obligation to you. You hereby irrevocably assign to us all rights, title, and interest in that Feedback, or, if that isn't possible, you grant us a perpetual, irrevocable, exclusive, worldwide, sublicenseable, royalty-free, fully paid-up license to use your Feedback. + +3\. Application information use. You grant us the right to use all information you provide in your application for the purposes of operating the consultant directory program, Flutter, and related operations, but always subject to the confidentiality provisions of the terms of use applicable to your use of Flutter. + +4\. Personal Data. + +(a) Authorization to Use and Share. We may use and share personal information that you provide to operate the consultant directory program and Flutter site, and exercise our rights, subject to Google's then-current Privacy Policy at policies.google.com/privacy (or such other URL as we may provide). For example, we may provide your information to potential customers who are interested in knowing more about you in relation to the consultant directory program. We may also use information from your submission to determine which other pilots in which we may invite you to participate, or products and services we might invite you to test. "Google Account" means Your Google account (either gmail.com address or an email address provided under the "Google Apps" product line), which is subject to applicable terms of service. + +(b) Our Responsibilities as Data Controller or Data Processor. You acknowledge and agree that we may either be a data controller or processor with respect to any personal data about you that you provide to us under these terms ("Your Data"), and that we are a data processor with respect to any personal data about your end users, employees, or agents ("End User Data") that you provide to us under this Agreement. NOTE: it is your obligation to avoid providing End User Data to us, other than business contact information for your employee or agent who may communicate with us regarding the consultant directory program; however, these terms are set forth here to cover this business contact information as well as any End User Data you may provide to us in contravention of this sub-paragraph. + +(i) The collection of Your Data under this Agreement is subject to the terms of Google's Privacy Policy (as may be amended from time to time) available at policies.google.com/privacy. + +(ii) You will assist us in securing consents from data subjects to the processing of End User Data in a timely manner before collecting and providing End User Data to us. + +(c) Your Responsibilities as Data Controller. To the extent you also access, use, store, or otherwise process Your Data or End User Data for your own purposes, you are also a data controller with respect to Your Data or End User Data. You will maintain a privacy policy that complies with applicable laws and is no less protective of Your Data and End User Data than Google's Privacy Policy. You will obtain necessary consents from data subjects to allow you and us to share Your Data and End User Data, and for your processing of Your Data and End User Data, for the purposes of these terms. + +(d) Data Transfer, Processing, and Storage. As part of providing our products and services, we may store, process, and serve End User Data provided to Google and Your Data in the United States or any other country in which Google or its agents maintain facilities. By using the Google products and services, you consent to this transfer, processing, and storage. + +(e) Data Return, Deletion, or Amendment. We have no obligation to return Your Data to You, although we will comply with requests from data subjects to delete or amend End User Data provided to us. + +(f) Data Deletion and Back-Up. We may delete Your Data from its systems at any time. You are solely responsible for backing up Your Data and End User Data. We will not bear any risk of loss for Your Data or Your access to End User Data. + +(g) Usage Analytics. Google will have access to your usage analytics. You are solely responsible for determining the scope of your notification to data subjects. + +5\. Term. These terms bind you and are effective as an agreement, effective when you click the "I Agree" button or submit the application form referencing these terms. Either party may terminate this agreement effective immediately on written notice. All provisions that under their terms or by implication ought to survive will survive. The agreement formed by these terms may be terminated by us without written notice by removing you from the consultant directory program, which shall be considered permanent termination of this agreement, but which shall be automatically reinstated if you seek and we grant reinstatement to the program. + +6\. Warranty Disclaimers. TO THE EXTENT PERMITTED BY LAW, FLUTTER AND GOOGLE PROVIDE ALL APPLICABLE PRODUCTS AND SERVICES AND OTHER ITEMS RELATED TO THIS AGREEMENT "AS IS" WITHOUT ANY REPRESENTATIONS OR WARRANTIES OF ANY KIND. TO THE EXTENT PERMITTED BY LAW, FLUTTER, GOOGLE AND THEIR SUPPLIERS DISCLAIM ALL EXPRESS OR IMPLIED REPRESENTATIONS, WARRANTIES, CONDITIONS AND GUARANTEES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + +7\. Indemnity. You will defend, indemnify, and hold harmless Flutter, Google and their affiliates, directors, officers, employees against all liabilities, damages, losses, costs, fees (including legal fees), and expenses relating to any allegation or third-party legal proceeding to the extent arising from: + +(a) your conduct under or in connection with this agreement;
+(b) your relationship with your customers, whether obtained via the consultant directory program or otherwise;
+(c) your breach of this Agreement; or
+(d) claiming that use, possession, or sale of software you develop or your products, services, content, or brand features violates or infringes the third party's rights, including intellectual property rights. + +8\. Limitation of Liability. + +(a) Liability. IN THIS SECTION 8, "LIABILITY" MEANS ANY LIABILITY, WHETHER UNDER CONTRACT, TORT, OR OTHERWISE, INCLUDING FOR NEGLIGENCE. + +(b) Limitations. SUBJECT TO SECTION 8 (c) (EXCEPTIONS TO LIMITATIONS): + +(i) NEITHER PARTY WILL HAVE ANY LIABILITY ARISING OUT OF OR RELATING TO THIS AGREEMENT FOR:
+(A) LOSS OF ANY DATA OR COMMUNICATIONS;
+(B) LOST PROFITS (WHETHER DIRECT OR INDIRECT);
+(C) INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL LOSSES (WHETHER OR NOT FORESEEABLE OR CONTEMPLATED BY THE PARTIES AT THE EFFECTIVE DATE); OR
+(D) EXEMPLARY OR PUNITIVE DAMAGES; AND
+(ii) EACH PARTY'S TOTAL AGGREGATE LIABILITY ARISING OUT OF OR RELATING TO THIS AGREEMENT IS LIMITED TO US$100. + +(c) Exceptions to Limitations. NOTHING IN THIS AGREEMENT EXCLUDES OR LIMITS EITHER PARTY'S LIABILITY FOR:
+ +(i) FRAUD OR FRAUDULENT MISREPRESENTATION;
+(iii) BREACH OF CONFIDENTIALITY;
+(iv) YOUR LIABILITY UNDER SECTION 7 (INDEMNITY);
+(v) INFRINGEMENT OF THE OTHER PARTY'S INTELLECTUAL PROPERTY RIGHTS; OR
+(vi) MATTERS FOR WHICH LIABILITY CANNOT BE EXCLUDED OR LIMITED UNDER APPLICABLE LAW. + +9\. Miscellaneous. All legal notices must be in English, in writing (which may be by email), and addressed to the other party's primary contact, which for Google is legal-notices@google.com. Any amendment must be in writing and signed by both parties. You may not assign any part of this Agreement without Google's prior written consent. Google may assign or delegate its rights and obligations under this Agreement. Neither party will be treated as having waived any rights by not exercising (or delaying the exercise of) any rights under this Agreement. This Agreement states all terms agreed between the parties and cancels and replaces all other agreements between the parties relating to its subject matter. ALL CLAIMS ARISING OUT OF OR RELATING TO THIS AGREEMENT WILL BE GOVERNED BY CALIFORNIA LAW, EXCLUDING CALIFORNIA'S CONFLICT OF LAWS RULES, AND WILL BE LITIGATED EXCLUSIVELY IN SANTA CLARA COUNTY, CALIFORNIA, USA. diff --git a/sites/www/content/consultants/images/implementation-consultants.png b/sites/www/content/consultants/images/implementation-consultants.png new file mode 100644 index 00000000000..da7ead064ce Binary files /dev/null and b/sites/www/content/consultants/images/implementation-consultants.png differ diff --git a/sites/www/content/consultants/images/third_party/_README.md b/sites/www/content/consultants/images/third_party/_README.md new file mode 100644 index 00000000000..169d45424dd --- /dev/null +++ b/sites/www/content/consultants/images/third_party/_README.md @@ -0,0 +1,13 @@ +# Third-party assets + +This directory contains logos and images belonging to third-party companies, +used here with permission for listing in the Flutter consultants directory. + +## License exception + +The assets in this directory are excluded from +this repository's standard license. + +These images and logos are the property of their respective owners. +To reuse, modify, redistribute, or use these assets in your own projects, +you must obtain permission from their respective owners. diff --git a/sites/www/content/consultants/images/third_party/partners/-_Eugene_Martseniuk.png b/sites/www/content/consultants/images/third_party/partners/-_Eugene_Martseniuk.png new file mode 100644 index 00000000000..530aa3d6718 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/-_Eugene_Martseniuk.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/7span_logo.png b/sites/www/content/consultants/images/third_party/partners/7span_logo.png new file mode 100644 index 00000000000..eb5d2ecdaf1 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/7span_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/80_bucks.png b/sites/www/content/consultants/images/third_party/partners/80_bucks.png new file mode 100644 index 00000000000..d734df25b3f Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/80_bucks.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Accenture.png b/sites/www/content/consultants/images/third_party/partners/Accenture.png new file mode 100644 index 00000000000..b26ba1adf12 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Accenture.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Antino.png b/sites/www/content/consultants/images/third_party/partners/Antino.png new file mode 100644 index 00000000000..b93b88c1882 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Antino.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/AppStarter_logo.png b/sites/www/content/consultants/images/third_party/partners/AppStarter_logo.png new file mode 100644 index 00000000000..551c33e9a0a Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/AppStarter_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Appventurez.png b/sites/www/content/consultants/images/third_party/partners/Appventurez.png new file mode 100644 index 00000000000..24fa39382fc Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Appventurez.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/ArcTouch.png b/sites/www/content/consultants/images/third_party/partners/ArcTouch.png new file mode 100644 index 00000000000..0a43ceb7b12 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/ArcTouch.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Arch.png b/sites/www/content/consultants/images/third_party/partners/Arch.png new file mode 100644 index 00000000000..80c76490d5f Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Arch.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Bacancy_logo.png b/sites/www/content/consultants/images/third_party/partners/Bacancy_logo.png new file mode 100644 index 00000000000..1ad29ab53cb Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Bacancy_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Baseflow.png b/sites/www/content/consultants/images/third_party/partners/Baseflow.png new file mode 100644 index 00000000000..d82bcb31164 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Baseflow.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Black_Airplane.png b/sites/www/content/consultants/images/third_party/partners/Black_Airplane.png new file mode 100644 index 00000000000..373462f6dce Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Black_Airplane.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Bosc_logo.png b/sites/www/content/consultants/images/third_party/partners/Bosc_logo.png new file mode 100644 index 00000000000..47fe68d61bd Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Bosc_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Bottle_Rocket.png b/sites/www/content/consultants/images/third_party/partners/Bottle_Rocket.png new file mode 100644 index 00000000000..bbf7853aff5 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Bottle_Rocket.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Chili.png b/sites/www/content/consultants/images/third_party/partners/Chili.png new file mode 100644 index 00000000000..a1f4f44ce74 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Chili.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Cleveroad_logo.png b/sites/www/content/consultants/images/third_party/partners/Cleveroad_logo.png new file mode 100644 index 00000000000..a573b273edd Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Cleveroad_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/CodeXLancers.png b/sites/www/content/consultants/images/third_party/partners/CodeXLancers.png new file mode 100644 index 00000000000..b9ea35d25ba Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/CodeXLancers.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Codeheroes.png b/sites/www/content/consultants/images/third_party/partners/Codeheroes.png new file mode 100644 index 00000000000..fe78eea9e31 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Codeheroes.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Dius.png b/sites/www/content/consultants/images/third_party/partners/Dius.png new file mode 100644 index 00000000000..09c795a92c9 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Dius.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Dribba.png b/sites/www/content/consultants/images/third_party/partners/Dribba.png new file mode 100644 index 00000000000..92f90478bef Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Dribba.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Fab_logo.png b/sites/www/content/consultants/images/third_party/partners/Fab_logo.png new file mode 100644 index 00000000000..6e363c4984f Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Fab_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Fast_live_line.png b/sites/www/content/consultants/images/third_party/partners/Fast_live_line.png new file mode 100644 index 00000000000..88f1745e859 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Fast_live_line.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/FiveDotTwelve.png b/sites/www/content/consultants/images/third_party/partners/FiveDotTwelve.png new file mode 100644 index 00000000000..5574fbbbee6 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/FiveDotTwelve.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Flexion_logo.png b/sites/www/content/consultants/images/third_party/partners/Flexion_logo.png new file mode 100644 index 00000000000..e7469a7aa3c Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Flexion_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Flutterlab_logo.png b/sites/www/content/consultants/images/third_party/partners/Flutterlab_logo.png new file mode 100644 index 00000000000..0aaa703ec66 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Flutterlab_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Flutternest_logo.png b/sites/www/content/consultants/images/third_party/partners/Flutternest_logo.png new file mode 100644 index 00000000000..574d18d999d Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Flutternest_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Frame_18.png b/sites/www/content/consultants/images/third_party/partners/Frame_18.png new file mode 100644 index 00000000000..e13d08a9627 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Frame_18.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/GSkinner.png b/sites/www/content/consultants/images/third_party/partners/GSkinner.png new file mode 100644 index 00000000000..2c37c408127 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/GSkinner.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/GeekyAnts.png b/sites/www/content/consultants/images/third_party/partners/GeekyAnts.png new file mode 100644 index 00000000000..abbe60b88df Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/GeekyAnts.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Hedgehog_Lab.png b/sites/www/content/consultants/images/third_party/partners/Hedgehog_Lab.png new file mode 100644 index 00000000000..5a37a082ffa Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Hedgehog_Lab.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/IBM_2.png b/sites/www/content/consultants/images/third_party/partners/IBM_2.png new file mode 100644 index 00000000000..cbd098fe97a Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/IBM_2.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/ICS.png b/sites/www/content/consultants/images/third_party/partners/ICS.png new file mode 100644 index 00000000000..2a3e77f7e09 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/ICS.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Iglu_logo.png b/sites/www/content/consultants/images/third_party/partners/Iglu_logo.png new file mode 100644 index 00000000000..598b85020b2 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Iglu_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Impaktfull_logo.png b/sites/www/content/consultants/images/third_party/partners/Impaktfull_logo.png new file mode 100644 index 00000000000..a8c91629ad8 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Impaktfull_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Incibit.png b/sites/www/content/consultants/images/third_party/partners/Incibit.png new file mode 100644 index 00000000000..e5b7ddebbb8 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Incibit.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Infinum.png b/sites/www/content/consultants/images/third_party/partners/Infinum.png new file mode 100644 index 00000000000..26f303acd5e Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Infinum.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Innoventix.png b/sites/www/content/consultants/images/third_party/partners/Innoventix.png new file mode 100644 index 00000000000..87e151934ea Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Innoventix.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Int.png b/sites/www/content/consultants/images/third_party/partners/Int.png new file mode 100644 index 00000000000..7200b3443dd Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Int.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Inthepocket.png b/sites/www/content/consultants/images/third_party/partners/Inthepocket.png new file mode 100644 index 00000000000..775d71277a1 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Inthepocket.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Ippon.png b/sites/www/content/consultants/images/third_party/partners/Ippon.png new file mode 100644 index 00000000000..13708b3bb8e Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Ippon.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Iteo.png b/sites/www/content/consultants/images/third_party/partners/Iteo.png new file mode 100644 index 00000000000..026e59638ce Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Iteo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Jiitaik.png b/sites/www/content/consultants/images/third_party/partners/Jiitaik.png new file mode 100644 index 00000000000..d1de784eca7 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Jiitaik.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Koderead_logo.png b/sites/www/content/consultants/images/third_party/partners/Koderead_logo.png new file mode 100644 index 00000000000..0814f82a471 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Koderead_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Krootl.png b/sites/www/content/consultants/images/third_party/partners/Krootl.png new file mode 100644 index 00000000000..e0db5241beb Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Krootl.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/LANARS_logo.png b/sites/www/content/consultants/images/third_party/partners/LANARS_logo.png new file mode 100644 index 00000000000..123c1a48e00 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/LANARS_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/LR.png b/sites/www/content/consultants/images/third_party/partners/LR.png new file mode 100644 index 00000000000..a92d642ef63 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/LR.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Lean_Code.png b/sites/www/content/consultants/images/third_party/partners/Lean_Code.png new file mode 100644 index 00000000000..99f06dbb737 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Lean_Code.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/LeenSpace_logo.png b/sites/www/content/consultants/images/third_party/partners/LeenSpace_logo.png new file mode 100644 index 00000000000..00304a1700a Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/LeenSpace_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Liquid_logo.png b/sites/www/content/consultants/images/third_party/partners/Liquid_logo.png new file mode 100644 index 00000000000..6abf0a6c319 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Liquid_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Logique_logo.png b/sites/www/content/consultants/images/third_party/partners/Logique_logo.png new file mode 100644 index 00000000000..0a36e47a45b Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Logique_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/LogoOnlyFabBlack - Joanna Laskowska.png b/sites/www/content/consultants/images/third_party/partners/LogoOnlyFabBlack - Joanna Laskowska.png new file mode 100644 index 00000000000..868d00fe93a Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/LogoOnlyFabBlack - Joanna Laskowska.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Loomery.png b/sites/www/content/consultants/images/third_party/partners/Loomery.png new file mode 100644 index 00000000000..159a2213c4d Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Loomery.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Marcin_Durawa.png b/sites/www/content/consultants/images/third_party/partners/Marcin_Durawa.png new file mode 100644 index 00000000000..e39cc03356d Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Marcin_Durawa.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Merix_Studio.png b/sites/www/content/consultants/images/third_party/partners/Merix_Studio.png new file mode 100644 index 00000000000..520ef80ebfe Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Merix_Studio.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Miquido.png b/sites/www/content/consultants/images/third_party/partners/Miquido.png new file mode 100644 index 00000000000..d6ae5e5508d Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Miquido.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Mobitouch_logo.png b/sites/www/content/consultants/images/third_party/partners/Mobitouch_logo.png new file mode 100644 index 00000000000..0fdc0d1640e Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Mobitouch_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Mokutan.png b/sites/www/content/consultants/images/third_party/partners/Mokutan.png new file mode 100644 index 00000000000..ddb7af03977 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Mokutan.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Momentum.png b/sites/www/content/consultants/images/third_party/partners/Momentum.png new file mode 100644 index 00000000000..831ced479cc Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Momentum.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Moonwise_logo.png b/sites/www/content/consultants/images/third_party/partners/Moonwise_logo.png new file mode 100644 index 00000000000..fa9f0160cbf Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Moonwise_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/NEON.png b/sites/www/content/consultants/images/third_party/partners/NEON.png new file mode 100644 index 00000000000..718c6358221 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/NEON.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Nagarro_logo.png b/sites/www/content/consultants/images/third_party/partners/Nagarro_logo.png new file mode 100644 index 00000000000..6736f854ac8 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Nagarro_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Netforemost_logo.png b/sites/www/content/consultants/images/third_party/partners/Netforemost_logo.png new file mode 100644 index 00000000000..2f6d720eb7d Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Netforemost_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Netglade.png b/sites/www/content/consultants/images/third_party/partners/Netglade.png new file mode 100644 index 00000000000..bc536daedb7 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Netglade.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Neusta_logo.png b/sites/www/content/consultants/images/third_party/partners/Neusta_logo.png new file mode 100644 index 00000000000..0824ee99554 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Neusta_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Next_Apps_-_Lukasz_Lojerczuk.png b/sites/www/content/consultants/images/third_party/partners/Next_Apps_-_Lukasz_Lojerczuk.png new file mode 100644 index 00000000000..3722c3ab0e6 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Next_Apps_-_Lukasz_Lojerczuk.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Nyoka.png b/sites/www/content/consultants/images/third_party/partners/Nyoka.png new file mode 100644 index 00000000000..7012e84853d Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Nyoka.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Octo_logo.png b/sites/www/content/consultants/images/third_party/partners/Octo_logo.png new file mode 100644 index 00000000000..de7ed7f0dcc Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Octo_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Open-Reply_logo.png b/sites/www/content/consultants/images/third_party/partners/Open-Reply_logo.png new file mode 100644 index 00000000000..1ec83a62eb4 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Open-Reply_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Paulonia.png b/sites/www/content/consultants/images/third_party/partners/Paulonia.png new file mode 100644 index 00000000000..d46748612d8 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Paulonia.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Pentagon.png b/sites/www/content/consultants/images/third_party/partners/Pentagon.png new file mode 100644 index 00000000000..11f2bc5f705 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Pentagon.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Plangora.png b/sites/www/content/consultants/images/third_party/partners/Plangora.png new file mode 100644 index 00000000000..c399033b154 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Plangora.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Pratik_Khivesara.png b/sites/www/content/consultants/images/third_party/partners/Pratik_Khivesara.png new file mode 100644 index 00000000000..435bbb347cd Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Pratik_Khivesara.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Qagency_logo.png b/sites/www/content/consultants/images/third_party/partners/Qagency_logo.png new file mode 100644 index 00000000000..fdc9d371580 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Qagency_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Reactree.png b/sites/www/content/consultants/images/third_party/partners/Reactree.png new file mode 100644 index 00000000000..95ed0eb61ff Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Reactree.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Rebel_App_Studio.png b/sites/www/content/consultants/images/third_party/partners/Rebel_App_Studio.png new file mode 100644 index 00000000000..722609a6098 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Rebel_App_Studio.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Saiful_Islam.png b/sites/www/content/consultants/images/third_party/partners/Saiful_Islam.png new file mode 100644 index 00000000000..6b73845ebf8 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Saiful_Islam.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Saurabh_Infosys.png b/sites/www/content/consultants/images/third_party/partners/Saurabh_Infosys.png new file mode 100644 index 00000000000..9059d6c97dd Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Saurabh_Infosys.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Shape_logo.png b/sites/www/content/consultants/images/third_party/partners/Shape_logo.png new file mode 100644 index 00000000000..aedacba9577 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Shape_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Shohei_Nakagawa.png b/sites/www/content/consultants/images/third_party/partners/Shohei_Nakagawa.png new file mode 100644 index 00000000000..4f051d9e2f9 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Shohei_Nakagawa.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Singular_design.png b/sites/www/content/consultants/images/third_party/partners/Singular_design.png new file mode 100644 index 00000000000..80efac0d8cb Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Singular_design.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/SnappX.png b/sites/www/content/consultants/images/third_party/partners/SnappX.png new file mode 100644 index 00000000000..015cdf486f6 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/SnappX.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/SolGoruz.png b/sites/www/content/consultants/images/third_party/partners/SolGoruz.png new file mode 100644 index 00000000000..949cd79219f Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/SolGoruz.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Solid.png b/sites/www/content/consultants/images/third_party/partners/Solid.png new file mode 100644 index 00000000000..37b0939a043 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Solid.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Somnio.png b/sites/www/content/consultants/images/third_party/partners/Somnio.png new file mode 100644 index 00000000000..2dbef7694fe Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Somnio.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Sunflower_Lab.png b/sites/www/content/consultants/images/third_party/partners/Sunflower_Lab.png new file mode 100644 index 00000000000..0548b147ce8 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Sunflower_Lab.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Supercharge.png b/sites/www/content/consultants/images/third_party/partners/Supercharge.png new file mode 100644 index 00000000000..e41edb118e4 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Supercharge.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Superformula_1.png b/sites/www/content/consultants/images/third_party/partners/Superformula_1.png new file mode 100644 index 00000000000..33b4389041b Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Superformula_1.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/TBR-group_LOGO.png b/sites/www/content/consultants/images/third_party/partners/TBR-group_LOGO.png new file mode 100644 index 00000000000..5253a0aed14 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/TBR-group_LOGO.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Techahead_logo.png b/sites/www/content/consultants/images/third_party/partners/Techahead_logo.png new file mode 100644 index 00000000000..9a49a9f60fc Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Techahead_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Telus.png b/sites/www/content/consultants/images/third_party/partners/Telus.png new file mode 100644 index 00000000000..2b39a257f74 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Telus.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/The_Tribe.png b/sites/www/content/consultants/images/third_party/partners/The_Tribe.png new file mode 100644 index 00000000000..04a0a50b193 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/The_Tribe.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Theodo_apps.png b/sites/www/content/consultants/images/third_party/partners/Theodo_apps.png new file mode 100644 index 00000000000..76f9d4a5d9d Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Theodo_apps.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/ThinkUp_logo.png b/sites/www/content/consultants/images/third_party/partners/ThinkUp_logo.png new file mode 100644 index 00000000000..07ccf391116 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/ThinkUp_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/ThisMightWork.png b/sites/www/content/consultants/images/third_party/partners/ThisMightWork.png new file mode 100644 index 00000000000..386ecfaac07 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/ThisMightWork.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Unlockd.png b/sites/www/content/consultants/images/third_party/partners/Unlockd.png new file mode 100644 index 00000000000..61a27c6a49d Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Unlockd.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/VGV.png b/sites/www/content/consultants/images/third_party/partners/VGV.png new file mode 100644 index 00000000000..e7809b5cff8 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/VGV.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Walturn.png b/sites/www/content/consultants/images/third_party/partners/Walturn.png new file mode 100644 index 00000000000..901ca3948c2 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Walturn.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/WebReinvent_logo.png b/sites/www/content/consultants/images/third_party/partners/WebReinvent_logo.png new file mode 100644 index 00000000000..9dae39c770b Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/WebReinvent_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Webkul_logo.png b/sites/www/content/consultants/images/third_party/partners/Webkul_logo.png new file mode 100644 index 00000000000..92cab47a423 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Webkul_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/William_Verhaeghe.png b/sites/www/content/consultants/images/third_party/partners/William_Verhaeghe.png new file mode 100644 index 00000000000..1b5d74d4b22 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/William_Verhaeghe.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Xam.png b/sites/www/content/consultants/images/third_party/partners/Xam.png new file mode 100644 index 00000000000..2b3c2071795 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Xam.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Xmartlabs_logo.png b/sites/www/content/consultants/images/third_party/partners/Xmartlabs_logo.png new file mode 100644 index 00000000000..6a7f178ee75 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Xmartlabs_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/ZeroOneGroup.png b/sites/www/content/consultants/images/third_party/partners/ZeroOneGroup.png new file mode 100644 index 00000000000..763c53e5bdb Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/ZeroOneGroup.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/Zuhlke.png b/sites/www/content/consultants/images/third_party/partners/Zuhlke.png new file mode 100644 index 00000000000..20ecac1db33 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/Zuhlke.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/apparence_logo_-_Gautier_Siclon.png b/sites/www/content/consultants/images/third_party/partners/apparence_logo_-_Gautier_Siclon.png new file mode 100644 index 00000000000..43e48033f37 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/apparence_logo_-_Gautier_Siclon.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/approachable_geek_-_Garrett_Barlocker.png b/sites/www/content/consultants/images/third_party/partners/approachable_geek_-_Garrett_Barlocker.png new file mode 100644 index 00000000000..07a9107d5fd Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/approachable_geek_-_Garrett_Barlocker.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/apptube.png b/sites/www/content/consultants/images/third_party/partners/apptube.png new file mode 100644 index 00000000000..9d4151f57ea Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/apptube.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/atomic_robot.png b/sites/www/content/consultants/images/third_party/partners/atomic_robot.png new file mode 100644 index 00000000000..c731d31a4b8 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/atomic_robot.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/doublecoconut_logo.png b/sites/www/content/consultants/images/third_party/partners/doublecoconut_logo.png new file mode 100644 index 00000000000..db2afd2a0ca Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/doublecoconut_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/ergosign.png b/sites/www/content/consultants/images/third_party/partners/ergosign.png new file mode 100644 index 00000000000..b5a065cfc91 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/ergosign.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/f22_labs.png b/sites/www/content/consultants/images/third_party/partners/f22_labs.png new file mode 100644 index 00000000000..4af76d61eb7 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/f22_labs.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/ff.next.png b/sites/www/content/consultants/images/third_party/partners/ff.next.png new file mode 100644 index 00000000000..9eb15a9b8b3 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/ff.next.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/fueled_logo.png b/sites/www/content/consultants/images/third_party/partners/fueled_logo.png new file mode 100644 index 00000000000..5f591f0020e Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/fueled_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/gits.id.png b/sites/www/content/consultants/images/third_party/partners/gits.id.png new file mode 100644 index 00000000000..c356cfa0fda Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/gits.id.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/glueglue.png b/sites/www/content/consultants/images/third_party/partners/glueglue.png new file mode 100644 index 00000000000..836cb49b563 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/glueglue.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/intent.png b/sites/www/content/consultants/images/third_party/partners/intent.png new file mode 100644 index 00000000000..936b41bd22d Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/intent.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/mr_milu.png b/sites/www/content/consultants/images/third_party/partners/mr_milu.png new file mode 100644 index 00000000000..c8fa66af0b8 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/mr_milu.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/phntm.png b/sites/www/content/consultants/images/third_party/partners/phntm.png new file mode 100644 index 00000000000..d50edc3b038 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/phntm.png differ diff --git a/sites/www/content/consultants/images/third_party/partners/zebAI_logo.png b/sites/www/content/consultants/images/third_party/partners/zebAI_logo.png new file mode 100644 index 00000000000..a1e3111c649 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/partners/zebAI_logo.png differ diff --git a/sites/www/content/consultants/images/third_party/resources/App.png b/sites/www/content/consultants/images/third_party/resources/App.png new file mode 100644 index 00000000000..d6f3ad4ed8a Binary files /dev/null and b/sites/www/content/consultants/images/third_party/resources/App.png differ diff --git a/sites/www/content/consultants/images/third_party/resources/Bizaia.png b/sites/www/content/consultants/images/third_party/resources/Bizaia.png new file mode 100644 index 00000000000..a072124b9d8 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/resources/Bizaia.png differ diff --git a/sites/www/content/consultants/images/third_party/resources/Developer_widget.png b/sites/www/content/consultants/images/third_party/resources/Developer_widget.png new file mode 100644 index 00000000000..713dd0da2e2 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/resources/Developer_widget.png differ diff --git a/sites/www/content/consultants/images/third_party/resources/Timeline.png b/sites/www/content/consultants/images/third_party/resources/Timeline.png new file mode 100644 index 00000000000..536cdfcb388 Binary files /dev/null and b/sites/www/content/consultants/images/third_party/resources/Timeline.png differ diff --git a/sites/www/content/consultants/index.md b/sites/www/content/consultants/index.md new file mode 100644 index 00000000000..357be025a7b --- /dev/null +++ b/sites/www/content/consultants/index.md @@ -0,0 +1,8 @@ +--- +title: Flutter consultants +bodyTags: interior partner +description: Agencies designing and developing successful Flutter apps +publishDate: "2023-08-24" +--- + + diff --git a/sites/www/content/culture/images/be-modest.png b/sites/www/content/culture/images/be-modest.png new file mode 100644 index 00000000000..4df8b925f65 Binary files /dev/null and b/sites/www/content/culture/images/be-modest.png differ diff --git a/sites/www/content/culture/images/be-open.png b/sites/www/content/culture/images/be-open.png new file mode 100644 index 00000000000..14c8ae932bb Binary files /dev/null and b/sites/www/content/culture/images/be-open.png differ diff --git a/sites/www/content/culture/images/be-respectful.png b/sites/www/content/culture/images/be-respectful.png new file mode 100644 index 00000000000..6d45e480984 Binary files /dev/null and b/sites/www/content/culture/images/be-respectful.png differ diff --git a/sites/www/content/culture/images/culture-quote-bg.png b/sites/www/content/culture/images/culture-quote-bg.png new file mode 100644 index 00000000000..1284bd182d5 Binary files /dev/null and b/sites/www/content/culture/images/culture-quote-bg.png differ diff --git a/sites/www/content/culture/images/flutter-community.png b/sites/www/content/culture/images/flutter-community.png new file mode 100644 index 00000000000..1151e32b7e9 Binary files /dev/null and b/sites/www/content/culture/images/flutter-community.png differ diff --git a/sites/www/content/culture/images/flutter-culture-of-inclusivity.png b/sites/www/content/culture/images/flutter-culture-of-inclusivity.png new file mode 100644 index 00000000000..060dfa1c2fc Binary files /dev/null and b/sites/www/content/culture/images/flutter-culture-of-inclusivity.png differ diff --git a/sites/www/content/culture/index.md b/sites/www/content/culture/index.md new file mode 100644 index 00000000000..78d1b31a9f3 --- /dev/null +++ b/sites/www/content/culture/index.md @@ -0,0 +1,8 @@ +--- +title: Culture +bodyTags: interior culture +description: One of the things we’re proudest of about Flutter is how people often comment on how open and welcoming the community is. No matter what your story is, you’re welcome here. +publishDate: "2021-11-15" +--- + + diff --git a/sites/www/content/development/desktop/images/build-performant.png b/sites/www/content/development/desktop/images/build-performant.png new file mode 100644 index 00000000000..c943f28af37 Binary files /dev/null and b/sites/www/content/development/desktop/images/build-performant.png differ diff --git a/sites/www/content/development/desktop/images/flutter-on-desktop.png b/sites/www/content/development/desktop/images/flutter-on-desktop.png new file mode 100644 index 00000000000..afc8dea15a3 Binary files /dev/null and b/sites/www/content/development/desktop/images/flutter-on-desktop.png differ diff --git a/sites/www/content/development/desktop/images/native-functionality.png b/sites/www/content/development/desktop/images/native-functionality.png new file mode 100644 index 00000000000..73612325af1 Binary files /dev/null and b/sites/www/content/development/desktop/images/native-functionality.png differ diff --git a/sites/www/content/development/desktop/images/scale-desktop-support.png b/sites/www/content/development/desktop/images/scale-desktop-support.png new file mode 100644 index 00000000000..12eca633609 Binary files /dev/null and b/sites/www/content/development/desktop/images/scale-desktop-support.png differ diff --git a/sites/www/content/development/desktop/images/target-more-users.svg b/sites/www/content/development/desktop/images/target-more-users.svg new file mode 100644 index 00000000000..3d1f722264c --- /dev/null +++ b/sites/www/content/development/desktop/images/target-more-users.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sites/www/content/development/desktop/index.md b/sites/www/content/development/desktop/index.md new file mode 100644 index 00000000000..033859f0db0 --- /dev/null +++ b/sites/www/content/development/desktop/index.md @@ -0,0 +1,8 @@ +--- +title: Desktop +bodyTags: interior development desktop +description: Flutter support for Desktop devices means you can scale your mobile app to Windows, macOS and Linux without rewriting from the same single codebase. +publishDate: "2021-10-21" +--- + + diff --git a/sites/www/content/development/embedded/images/build-for-any-device.png b/sites/www/content/development/embedded/images/build-for-any-device.png new file mode 100644 index 00000000000..d2ff21e35c0 Binary files /dev/null and b/sites/www/content/development/embedded/images/build-for-any-device.png differ diff --git a/sites/www/content/development/embedded/images/flutter-on-embedded-devices.png b/sites/www/content/development/embedded/images/flutter-on-embedded-devices.png new file mode 100644 index 00000000000..1adea15922d Binary files /dev/null and b/sites/www/content/development/embedded/images/flutter-on-embedded-devices.png differ diff --git a/sites/www/content/development/embedded/images/growing-ecosystem.png b/sites/www/content/development/embedded/images/growing-ecosystem.png new file mode 100644 index 00000000000..4fd1985db7e Binary files /dev/null and b/sites/www/content/development/embedded/images/growing-ecosystem.png differ diff --git a/sites/www/content/development/embedded/images/iterate-locally.png b/sites/www/content/development/embedded/images/iterate-locally.png new file mode 100644 index 00000000000..7f4e77563b8 Binary files /dev/null and b/sites/www/content/development/embedded/images/iterate-locally.png differ diff --git a/sites/www/content/development/embedded/images/portable-code.png b/sites/www/content/development/embedded/images/portable-code.png new file mode 100644 index 00000000000..bfbf139875e Binary files /dev/null and b/sites/www/content/development/embedded/images/portable-code.png differ diff --git a/sites/www/content/development/embedded/images/prototype-faster.png b/sites/www/content/development/embedded/images/prototype-faster.png new file mode 100644 index 00000000000..4a3de24b87a Binary files /dev/null and b/sites/www/content/development/embedded/images/prototype-faster.png differ diff --git a/sites/www/content/development/embedded/images/scale-flexibly.png b/sites/www/content/development/embedded/images/scale-flexibly.png new file mode 100644 index 00000000000..a56b5ae1e21 Binary files /dev/null and b/sites/www/content/development/embedded/images/scale-flexibly.png differ diff --git a/sites/www/content/development/embedded/index.md b/sites/www/content/development/embedded/index.md new file mode 100644 index 00000000000..539e9589042 --- /dev/null +++ b/sites/www/content/development/embedded/index.md @@ -0,0 +1,8 @@ +--- +title: Embedded +bodyTags: interior development embedded +description: Flutter embedded support means you can create high quality custom solutions for your customers on any device with a powerful, flexible UI toolkit. +publishDate: "2021-10-21" +--- + + diff --git a/sites/www/content/development/images/beautiful-apps-for-every-screen.png b/sites/www/content/development/images/beautiful-apps-for-every-screen.png new file mode 100644 index 00000000000..221e4811703 Binary files /dev/null and b/sites/www/content/development/images/beautiful-apps-for-every-screen.png differ diff --git a/sites/www/content/development/images/build-ai-experiences.png b/sites/www/content/development/images/build-ai-experiences.png new file mode 100644 index 00000000000..d8b9d742b5a Binary files /dev/null and b/sites/www/content/development/images/build-ai-experiences.png differ diff --git a/sites/www/content/development/images/customize-every-pixel.svg b/sites/www/content/development/images/customize-every-pixel.svg new file mode 100644 index 00000000000..58017ae5aa3 --- /dev/null +++ b/sites/www/content/development/images/customize-every-pixel.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sites/www/content/development/images/desktop.jpg b/sites/www/content/development/images/desktop.jpg new file mode 100644 index 00000000000..db384238574 Binary files /dev/null and b/sites/www/content/development/images/desktop.jpg differ diff --git a/sites/www/content/development/images/dev-tools.jpg b/sites/www/content/development/images/dev-tools.jpg new file mode 100644 index 00000000000..93734b4856a Binary files /dev/null and b/sites/www/content/development/images/dev-tools.jpg differ diff --git a/sites/www/content/development/images/documentation.jpg b/sites/www/content/development/images/documentation.jpg new file mode 100644 index 00000000000..5a41d5f1e34 Binary files /dev/null and b/sites/www/content/development/images/documentation.jpg differ diff --git a/sites/www/content/development/images/embedded.jpg b/sites/www/content/development/images/embedded.jpg new file mode 100644 index 00000000000..23a2841834f Binary files /dev/null and b/sites/www/content/development/images/embedded.jpg differ diff --git a/sites/www/content/development/images/icons/follow-the-roadmap.svg b/sites/www/content/development/images/icons/follow-the-roadmap.svg new file mode 100644 index 00000000000..a42334e1c80 --- /dev/null +++ b/sites/www/content/development/images/icons/follow-the-roadmap.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/sites/www/content/development/images/icons/get-started-in-docs.svg b/sites/www/content/development/images/icons/get-started-in-docs.svg new file mode 100644 index 00000000000..89a8ceb0181 --- /dev/null +++ b/sites/www/content/development/images/icons/get-started-in-docs.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/sites/www/content/development/images/icons/see-the-samples.svg b/sites/www/content/development/images/icons/see-the-samples.svg new file mode 100644 index 00000000000..8eeb3c6979a --- /dev/null +++ b/sites/www/content/development/images/icons/see-the-samples.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/sites/www/content/development/images/icons/watch-the-video.svg b/sites/www/content/development/images/icons/watch-the-video.svg new file mode 100644 index 00000000000..7f7dee806e5 --- /dev/null +++ b/sites/www/content/development/images/icons/watch-the-video.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/sites/www/content/development/images/mobile.jpg b/sites/www/content/development/images/mobile.jpg new file mode 100644 index 00000000000..252407b14d1 Binary files /dev/null and b/sites/www/content/development/images/mobile.jpg differ diff --git a/sites/www/content/development/images/multi-platform-testimonials-bg.jpg b/sites/www/content/development/images/multi-platform-testimonials-bg.jpg new file mode 100644 index 00000000000..b1d8b433865 Binary files /dev/null and b/sites/www/content/development/images/multi-platform-testimonials-bg.jpg differ diff --git a/sites/www/content/development/images/open-source-ecosystem.jpg b/sites/www/content/development/images/open-source-ecosystem.jpg new file mode 100644 index 00000000000..9673b18dc46 Binary files /dev/null and b/sites/www/content/development/images/open-source-ecosystem.jpg differ diff --git a/sites/www/content/development/images/performant-by-design.png b/sites/www/content/development/images/performant-by-design.png new file mode 100644 index 00000000000..a0e1d82679a Binary files /dev/null and b/sites/www/content/development/images/performant-by-design.png differ diff --git a/sites/www/content/development/images/single-codebase.png b/sites/www/content/development/images/single-codebase.png new file mode 100644 index 00000000000..70a3bb7f0bd Binary files /dev/null and b/sites/www/content/development/images/single-codebase.png differ diff --git a/sites/www/content/development/images/web-apps.jpg b/sites/www/content/development/images/web-apps.jpg new file mode 100644 index 00000000000..5280d50ad86 Binary files /dev/null and b/sites/www/content/development/images/web-apps.jpg differ diff --git a/sites/www/content/development/index.md b/sites/www/content/development/index.md new file mode 100644 index 00000000000..7e5a1c99f04 --- /dev/null +++ b/sites/www/content/development/index.md @@ -0,0 +1,8 @@ +--- +title: Development +bodyTags: interior development +description: Flutter allows you to build apps for mobile, web, desktop, and embedded devices — all from a single codebase. +publishDate: "2021-10-21" +--- + + diff --git a/sites/www/content/development/ios/images/declarative-syntax-tab.png b/sites/www/content/development/ios/images/declarative-syntax-tab.png new file mode 100644 index 00000000000..c71180a6e5f Binary files /dev/null and b/sites/www/content/development/ios/images/declarative-syntax-tab.png differ diff --git a/sites/www/content/development/ios/images/engine.png b/sites/www/content/development/ios/images/engine.png new file mode 100644 index 00000000000..b5ff347c626 Binary files /dev/null and b/sites/www/content/development/ios/images/engine.png differ diff --git a/sites/www/content/development/ios/images/flutter-net.svg b/sites/www/content/development/ios/images/flutter-net.svg new file mode 100644 index 00000000000..ea73cd02e8b --- /dev/null +++ b/sites/www/content/development/ios/images/flutter-net.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sites/www/content/development/ios/images/flutter-on-ios.png b/sites/www/content/development/ios/images/flutter-on-ios.png new file mode 100644 index 00000000000..336209e2716 Binary files /dev/null and b/sites/www/content/development/ios/images/flutter-on-ios.png differ diff --git a/sites/www/content/development/ios/images/flutter-open-source.svg b/sites/www/content/development/ios/images/flutter-open-source.svg new file mode 100644 index 00000000000..93d4a288ef5 --- /dev/null +++ b/sites/www/content/development/ios/images/flutter-open-source.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sites/www/content/development/ios/images/framework.png b/sites/www/content/development/ios/images/framework.png new file mode 100644 index 00000000000..b68dcb2eb2c Binary files /dev/null and b/sites/www/content/development/ios/images/framework.png differ diff --git a/sites/www/content/development/ios/images/github-contributors.svg b/sites/www/content/development/ios/images/github-contributors.svg new file mode 100644 index 00000000000..398a23bdd5e --- /dev/null +++ b/sites/www/content/development/ios/images/github-contributors.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/sites/www/content/development/ios/images/github-stars.svg b/sites/www/content/development/ios/images/github-stars.svg new file mode 100644 index 00000000000..fe34931603b --- /dev/null +++ b/sites/www/content/development/ios/images/github-stars.svg @@ -0,0 +1,4 @@ + + + + diff --git a/sites/www/content/development/ios/images/header-image-1.png b/sites/www/content/development/ios/images/header-image-1.png new file mode 100644 index 00000000000..eef6cc7bf3c Binary files /dev/null and b/sites/www/content/development/ios/images/header-image-1.png differ diff --git a/sites/www/content/development/ios/images/header-image-2.png b/sites/www/content/development/ios/images/header-image-2.png new file mode 100644 index 00000000000..0368d5957d8 Binary files /dev/null and b/sites/www/content/development/ios/images/header-image-2.png differ diff --git a/sites/www/content/development/ios/images/header-image-3.png b/sites/www/content/development/ios/images/header-image-3.png new file mode 100644 index 00000000000..c9a4fed180e Binary files /dev/null and b/sites/www/content/development/ios/images/header-image-3.png differ diff --git a/sites/www/content/development/ios/images/header-image-4.png b/sites/www/content/development/ios/images/header-image-4.png new file mode 100644 index 00000000000..c0e5db760e3 Binary files /dev/null and b/sites/www/content/development/ios/images/header-image-4.png differ diff --git a/sites/www/content/development/ios/images/header-image-background.png b/sites/www/content/development/ios/images/header-image-background.png new file mode 100644 index 00000000000..02664757967 Binary files /dev/null and b/sites/www/content/development/ios/images/header-image-background.png differ diff --git a/sites/www/content/development/ios/images/header-image-background.svg b/sites/www/content/development/ios/images/header-image-background.svg new file mode 100644 index 00000000000..715255a80ae --- /dev/null +++ b/sites/www/content/development/ios/images/header-image-background.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sites/www/content/development/ios/images/interoperability-with-apple.png b/sites/www/content/development/ios/images/interoperability-with-apple.png new file mode 100644 index 00000000000..7745dec8840 Binary files /dev/null and b/sites/www/content/development/ios/images/interoperability-with-apple.png differ diff --git a/sites/www/content/development/ios/images/ios-developer-metrics.svg b/sites/www/content/development/ios/images/ios-developer-metrics.svg new file mode 100644 index 00000000000..5a12595b234 --- /dev/null +++ b/sites/www/content/development/ios/images/ios-developer-metrics.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sites/www/content/development/ios/images/native-performance.png b/sites/www/content/development/ios/images/native-performance.png new file mode 100644 index 00000000000..c7304dda1a6 Binary files /dev/null and b/sites/www/content/development/ios/images/native-performance.png differ diff --git a/sites/www/content/development/ios/images/platform-embedder.png b/sites/www/content/development/ios/images/platform-embedder.png new file mode 100644 index 00000000000..dfb33ae7c46 Binary files /dev/null and b/sites/www/content/development/ios/images/platform-embedder.png differ diff --git a/sites/www/content/development/ios/images/productive-team.png b/sites/www/content/development/ios/images/productive-team.png new file mode 100644 index 00000000000..1b536482aac Binary files /dev/null and b/sites/www/content/development/ios/images/productive-team.png differ diff --git a/sites/www/content/development/ios/images/rich-ecosystem-1.png b/sites/www/content/development/ios/images/rich-ecosystem-1.png new file mode 100644 index 00000000000..7c460dc3351 Binary files /dev/null and b/sites/www/content/development/ios/images/rich-ecosystem-1.png differ diff --git a/sites/www/content/development/ios/images/rich-ecosystem-2.png b/sites/www/content/development/ios/images/rich-ecosystem-2.png new file mode 100644 index 00000000000..6e1a655622c Binary files /dev/null and b/sites/www/content/development/ios/images/rich-ecosystem-2.png differ diff --git a/sites/www/content/development/ios/images/top-brands-alibaba.svg b/sites/www/content/development/ios/images/top-brands-alibaba.svg new file mode 100644 index 00000000000..b692014a260 --- /dev/null +++ b/sites/www/content/development/ios/images/top-brands-alibaba.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/sites/www/content/development/ios/images/top-brands-background.svg b/sites/www/content/development/ios/images/top-brands-background.svg new file mode 100644 index 00000000000..75b345a48e6 --- /dev/null +++ b/sites/www/content/development/ios/images/top-brands-background.svg @@ -0,0 +1,3 @@ + + + diff --git a/sites/www/content/development/ios/images/top-brands-bmw.svg b/sites/www/content/development/ios/images/top-brands-bmw.svg new file mode 100644 index 00000000000..7fa1d6260e3 --- /dev/null +++ b/sites/www/content/development/ios/images/top-brands-bmw.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/sites/www/content/development/ios/images/top-brands-etermax.svg b/sites/www/content/development/ios/images/top-brands-etermax.svg new file mode 100644 index 00000000000..388965c7e06 --- /dev/null +++ b/sites/www/content/development/ios/images/top-brands-etermax.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/sites/www/content/development/ios/images/top-brands-headspace.svg b/sites/www/content/development/ios/images/top-brands-headspace.svg new file mode 100644 index 00000000000..54d8be60534 --- /dev/null +++ b/sites/www/content/development/ios/images/top-brands-headspace.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/sites/www/content/development/ios/images/top-brands-supercell.svg b/sites/www/content/development/ios/images/top-brands-supercell.svg new file mode 100644 index 00000000000..c230f78436c --- /dev/null +++ b/sites/www/content/development/ios/images/top-brands-supercell.svg @@ -0,0 +1,3 @@ + + + diff --git a/sites/www/content/development/ios/images/top-brands-tencent.svg b/sites/www/content/development/ios/images/top-brands-tencent.svg new file mode 100644 index 00000000000..9286ba9e8f6 --- /dev/null +++ b/sites/www/content/development/ios/images/top-brands-tencent.svg @@ -0,0 +1,3 @@ + + + diff --git a/sites/www/content/development/ios/images/top-brands-toyota.svg b/sites/www/content/development/ios/images/top-brands-toyota.svg new file mode 100644 index 00000000000..4b1268373e3 --- /dev/null +++ b/sites/www/content/development/ios/images/top-brands-toyota.svg @@ -0,0 +1,3 @@ + + + diff --git a/sites/www/content/development/ios/images/top-brands-universal.svg b/sites/www/content/development/ios/images/top-brands-universal.svg new file mode 100644 index 00000000000..104595e3514 --- /dev/null +++ b/sites/www/content/development/ios/images/top-brands-universal.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/sites/www/content/development/ios/images/video-background.png b/sites/www/content/development/ios/images/video-background.png new file mode 100644 index 00000000000..1b1471ffc5e Binary files /dev/null and b/sites/www/content/development/ios/images/video-background.png differ diff --git a/sites/www/content/development/ios/index.md b/sites/www/content/development/ios/index.md new file mode 100644 index 00000000000..7500afbbb1a --- /dev/null +++ b/sites/www/content/development/ios/index.md @@ -0,0 +1,10 @@ +--- +title: Flutter on iOS +bodyTags: interior development ios +description: >- + Learn how Flutter can help you build beautiful, fast, and feature-rich + applications for iOS and other platforms from a single codebase! +publishDate: "2023-08-03" +--- + + diff --git a/sites/www/content/development/ios/top_brands.yaml b/sites/www/content/development/ios/top_brands.yaml new file mode 100644 index 00000000000..3e2cb221b88 --- /dev/null +++ b/sites/www/content/development/ios/top_brands.yaml @@ -0,0 +1,31 @@ +# This file contains the source data used to populate the +# "Join other top brands and apps using Flutter" card grid on +# the https://flutter.dev/multi-platform/ios page. +# +# Don't open PRs with additions to this list. +# The site maintainers will update it as needed. + +- name: Alibaba + src: images/top-brands-alibaba.svg + href: /showcase/alibaba-group +- name: Supercell + src: images/top-brands-supercell.svg + href: /showcase/supercell +- name: Etermax + src: images/top-brands-etermax.svg + href: /showcase/etermax +- name: Toyota + src: images/top-brands-toyota.svg + href: /showcase/toyota +- name: Headspace + src: images/top-brands-headspace.svg + href: /showcase/headspace +- name: BMW + src: images/top-brands-bmw.svg + href: /showcase/bmw +- name: Universal + src: images/top-brands-universal.svg + href: /showcase/universal-studios +- name: Tencent + src: images/top-brands-tencent.svg + href: /showcase/tencent diff --git a/sites/www/content/development/mobile/images/all-mobile-day-one.png b/sites/www/content/development/mobile/images/all-mobile-day-one.png new file mode 100644 index 00000000000..5055eb72fe2 Binary files /dev/null and b/sites/www/content/development/mobile/images/all-mobile-day-one.png differ diff --git a/sites/www/content/development/mobile/images/build-for-all-as-one-team.png b/sites/www/content/development/mobile/images/build-for-all-as-one-team.png new file mode 100644 index 00000000000..638b783be0f Binary files /dev/null and b/sites/www/content/development/mobile/images/build-for-all-as-one-team.png differ diff --git a/sites/www/content/development/mobile/images/do-more-with-less.png b/sites/www/content/development/mobile/images/do-more-with-less.png new file mode 100644 index 00000000000..af615d556cb Binary files /dev/null and b/sites/www/content/development/mobile/images/do-more-with-less.png differ diff --git a/sites/www/content/development/mobile/images/flutter-on-mobile.png b/sites/www/content/development/mobile/images/flutter-on-mobile.png new file mode 100644 index 00000000000..01e65919733 Binary files /dev/null and b/sites/www/content/development/mobile/images/flutter-on-mobile.png differ diff --git a/sites/www/content/development/mobile/images/one-experience.png b/sites/www/content/development/mobile/images/one-experience.png new file mode 100644 index 00000000000..73388e0b2af Binary files /dev/null and b/sites/www/content/development/mobile/images/one-experience.png differ diff --git a/sites/www/content/development/mobile/index.md b/sites/www/content/development/mobile/index.md new file mode 100644 index 00000000000..eb66a199468 --- /dev/null +++ b/sites/www/content/development/mobile/index.md @@ -0,0 +1,8 @@ +--- +title: Mobile +bodyTags: interior development mobile +description: Bring your app idea to life to more users from day one by building with Flutter on iOS and Android simultaneously, without sacrificing features, quality, or performance. +publishDate: "2021-10-21" +--- + + diff --git a/sites/www/content/development/web/images/all-one-codebase.png b/sites/www/content/development/web/images/all-one-codebase.png new file mode 100644 index 00000000000..09805ee1b26 Binary files /dev/null and b/sites/www/content/development/web/images/all-one-codebase.png differ diff --git a/sites/www/content/development/web/images/build-better-web-apps.png b/sites/www/content/development/web/images/build-better-web-apps.png new file mode 100644 index 00000000000..763852efa66 Binary files /dev/null and b/sites/www/content/development/web/images/build-better-web-apps.png differ diff --git a/sites/www/content/development/web/images/build-wasm.png b/sites/www/content/development/web/images/build-wasm.png new file mode 100644 index 00000000000..c943f28af37 Binary files /dev/null and b/sites/www/content/development/web/images/build-wasm.png differ diff --git a/sites/www/content/development/web/images/flutter-on-web.png b/sites/www/content/development/web/images/flutter-on-web.png new file mode 100644 index 00000000000..b288e44f94c Binary files /dev/null and b/sites/www/content/development/web/images/flutter-on-web.png differ diff --git a/sites/www/content/development/web/images/prototype-faster.png b/sites/www/content/development/web/images/prototype-faster.png new file mode 100644 index 00000000000..4a3de24b87a Binary files /dev/null and b/sites/www/content/development/web/images/prototype-faster.png differ diff --git a/sites/www/content/development/web/images/reach-more-users.png b/sites/www/content/development/web/images/reach-more-users.png new file mode 100644 index 00000000000..7a38e4e6db6 Binary files /dev/null and b/sites/www/content/development/web/images/reach-more-users.png differ diff --git a/sites/www/content/development/web/index.md b/sites/www/content/development/web/index.md new file mode 100644 index 00000000000..95b7c897dca --- /dev/null +++ b/sites/www/content/development/web/index.md @@ -0,0 +1,8 @@ +--- +title: Web +bodyTags: interior development web +description: Flutter’s web support combines the power of the web and the flexibility of Flutter to reach more users with the same experience in the browser as on mobile devices. +publishDate: "2021-10-21" +--- + + diff --git a/sites/www/content/ecosystem/images/community-get-involved.png b/sites/www/content/ecosystem/images/community-get-involved.png new file mode 100644 index 00000000000..86543fc5a5e Binary files /dev/null and b/sites/www/content/ecosystem/images/community-get-involved.png differ diff --git a/sites/www/content/ecosystem/images/community.jpg b/sites/www/content/ecosystem/images/community.jpg new file mode 100644 index 00000000000..628571b59bf Binary files /dev/null and b/sites/www/content/ecosystem/images/community.jpg differ diff --git a/sites/www/content/ecosystem/images/consultants.png b/sites/www/content/ecosystem/images/consultants.png new file mode 100644 index 00000000000..1e326aac1bc Binary files /dev/null and b/sites/www/content/ecosystem/images/consultants.png differ diff --git a/sites/www/content/ecosystem/images/events.jpg b/sites/www/content/ecosystem/images/events.jpg new file mode 100644 index 00000000000..a5a91296a02 Binary files /dev/null and b/sites/www/content/ecosystem/images/events.jpg differ diff --git a/sites/www/content/ecosystem/images/everyone-is-invited.png b/sites/www/content/ecosystem/images/everyone-is-invited.png new file mode 100644 index 00000000000..17af03af693 Binary files /dev/null and b/sites/www/content/ecosystem/images/everyone-is-invited.png differ diff --git a/sites/www/content/ecosystem/images/packages-integrations.png b/sites/www/content/ecosystem/images/packages-integrations.png new file mode 100644 index 00000000000..4beec527025 Binary files /dev/null and b/sites/www/content/ecosystem/images/packages-integrations.png differ diff --git a/sites/www/content/ecosystem/images/packages.png b/sites/www/content/ecosystem/images/packages.png new file mode 100644 index 00000000000..d4d12c04749 Binary files /dev/null and b/sites/www/content/ecosystem/images/packages.png differ diff --git a/sites/www/content/ecosystem/images/strong-ecosystem-open-source.png b/sites/www/content/ecosystem/images/strong-ecosystem-open-source.png new file mode 100644 index 00000000000..9dc4962f3dc Binary files /dev/null and b/sites/www/content/ecosystem/images/strong-ecosystem-open-source.png differ diff --git a/sites/www/content/ecosystem/index.md b/sites/www/content/ecosystem/index.md new file mode 100644 index 00000000000..3fd11f33d82 --- /dev/null +++ b/sites/www/content/ecosystem/index.md @@ -0,0 +1,8 @@ +--- +title: Ecosystem +bodyTags: interior ecosystem +description: From packages and plugins to friendly developers, find all of the resources you need to be successful with Flutter. +publishDate: "2021-10-21" +--- + + diff --git a/sites/www/content/events/data/calendar.yaml b/sites/www/content/events/data/calendar.yaml new file mode 100644 index 00000000000..bf9e4e4d050 --- /dev/null +++ b/sites/www/content/events/data/calendar.yaml @@ -0,0 +1,160 @@ +- title: "Google Cloud Next" + description: "Join us in Las Vegas, NV for Google Cloud Next." + date: "2026-04-22" + link: "https://cloud.google.com/next" + card: "images/calendar/next26.gif" + location: "NA" + host: "Google" + backgroundColor: "#000000" + +- title: "Flutterconf Spain" + description: "Join us in Malaga, Spain for Flutterconf Spain." + date: "2026-05-08" + link: "https://flutterconf.es/" + card: "images/calendar/flutterconf.png" + location: "EMEA" + host: "Community" + backgroundColor: "#006395" + +- title: "Google I/O" + description: "Join us in Sunnyvale, USA for Google I/O." + date: "2026-05-19" + link: "https://io.google/2026/?utm_source=flutter&utm_medium=embedded_marketing&utm_campaign=flutter" + card: "images/calendar/io26.png" + location: "NA" + host: "Google" + backgroundColor: "#000000" + +- title: "Flutter Flow Developers Conference" + description: "Join us in San Francisco, CA for the Flutter Flow Developers Conference." + date: "2026-05-27" + link: "https://www.ffdc.io/" + card: "images/calendar/flutterflow.png" + location: "NA" + host: "Community" + +- title: "mDevCamp" + description: "Join us in Prague, Czechia for mDevCamp." + date: "2026-06-03" + link: "https://mdevcamp.eu/" + card: "images/calendar/mdevcamp26.png" + location: "EMEA" + host: "Community" + +- title: "Flutter Tech Summit" + description: "Join us in Warsaw, Poland for Flutter Tech Summit." + date: "2026-06-09" + link: "https://www.fluttertechsummit.com/" + card: "images/calendar/fluttertechsummit26.png" + location: "EMEA" + host: "Community" + backgroundColor: "#000000" + +- title: "Config" + description: "Join us in San Francisco, CA for Config." + date: "2026-06-23" + link: "https://config.figma.com/" + card: "images/calendar/config26.png" + location: "NA" + host: "Industry" + backgroundColor: "#000000" + +- title: "I/O Connect Berlin" + description: "Join us in Berlin, Germany for I/O Connect." + date: "2026-06-25" + card: "images/calendar/io26.png" + location: "EMEA" + host: "Google" + backgroundColor: "#000000" + +- title: "I/O Connect Bengaluru" + description: "Join us in Bengaluru, India for I/O Connect." + date: "2026-07-14" + card: "images/calendar/io26.png" + location: "APAC" + host: "Google" + backgroundColor: "#000000" + +- title: "Fluttercon USA" + description: "Join us in Orlando, FL for Fluttercon USA." + date: "2026-07-16" + link: "https://www.flutterconusa.dev/" + card: "images/calendar/fluttercon.png" + location: "NA" + host: "Community" + +- title: "Ai4" + description: "Join us in Las Vegas, NV for Ai4." + date: "2026-08-04" + link: "https://ai4.io/" + card: "images/calendar/ai426.png" + location: "NA" + host: "Industry" + backgroundColor: "#000000" + +- title: "I/O Connect China" + description: "Join us in China for I/O Connect." + date: "2026-08-07" + card: "images/calendar/io26.png" + location: "APAC" + host: "Google" + backgroundColor: "#000000" + +- title: "RenderATL" + description: "Join us in Atlanta, GA for RenderATL." + date: "2026-08-12" + link: "https://www.renderatl.com/" + card: "images/calendar/render26.svg" + location: "NA" + host: "Community" + +- title: "Flutter & Friends" + description: "Join us in Stockholm, Sweden for Flutter & Friends." + date: "2026-09-03" + link: "https://flutterfriends.dev/" + card: "images/calendar/flutter_friends.png" + location: "EMEA" + host: "Community" + +- title: "FlutterConf LATAM" + description: "Join us in Cancún, México for FlutterConf LATAM." + date: "2026-09-22" + link: "https://flutterconflatam.dev/" + card: "images/calendar/flutterconflatam26.png" + location: "LATAM" + host: "Community" + backgroundColor: "#042B59" + +- title: "next.app devcon" + description: "Join us in Berlin, Germany for next.app devcon." + date: "2026-10-07" + link: "https://www.nextappcon.com/" + card: "images/calendar/nextapp26.png" + location: "EMEA" + host: "Community" + backgroundColor: "#FF55E7" + +- title: "All Things Open" + description: "Join us in Raleigh, NC for All Things Open." + date: "2026-10-19" + link: "https://allthingsopen.org/events/all-things-open-2026" + card: "images/calendar/allthingsopen26.svg" + location: "NA" + host: "Industry" + +- title: "Flutter Kaigi/Ninjas" + description: "Join us in Tokyo, Japan for Flutter Kaigi/Ninjas." + date: "2026-10-29" + link: "https://medium.com/flutterkaigi/flutterkaigi-2026-%E9%96%8B%E5%82%AC%E3%81%AE%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B-f78a1421fe08" + card: "images/calendar/kaigi.png" + location: "APAC" + host: "Community" + backgroundColor: "#ffffff" + +- title: "Google for Developers events (DevFest and Build with AI)" + description: "Join us at Google for Developers events taking place throughout Fall and Winter 2026." + date: "2026-11-01" + link: "https://developers.google.com/community" + card: "images/calendar/gfd26.png" + location: "Virtual" + host: "Google" diff --git a/sites/www/content/events/data/featured.yaml b/sites/www/content/events/data/featured.yaml new file mode 100644 index 00000000000..5ef354ade43 --- /dev/null +++ b/sites/www/content/events/data/featured.yaml @@ -0,0 +1,32 @@ +# Featured events for the carousel on the events page. +# Each event has: title, description, image, link, backgroundColor + +- title: "Google I/O" + description: "Join us in Sunnyvale, USA for Google I/O on May 19, 2026." + image: "images/featured/io-featured.gif" + link: "https://events.google.com/io" + backgroundColor: "#000000" + +- title: "Fluttercon USA" + description: "Join us in Orlando, FL for Fluttercon USA on July 16, 2026." + image: "images/featured/fluttercon-featured.avif" + link: "https://www.flutterconusa.dev/" + backgroundColor: "#3377FF" + +- title: "next.app devcon" + description: "Join us in Berlin, Germany for next.app devcon on October 7, 2026." + image: "images/featured/nextapp-featured.png" + link: "https://www.nextappcon.com/" + backgroundColor: "#FF55E7" + +- title: "Flutter & Friends" + description: "Join us in Stockholm, Sweden for Flutter & Friends on September 3, 2026." + image: "images/featured/flutter_friends-featured.png" + link: "https://flutterfriends.dev/" + backgroundColor: "#0072D6" + +- title: "FlutterConf LATAM" + description: "Join us in Cancún, México for FlutterConf LATAM on September 22, 2026." + image: "images/featured/flutterconflatam26-featured.png" + link: "https://flutterconflatam.dev/" + backgroundColor: "#042B59" diff --git a/sites/www/content/events/images/attend-flutter-events.png b/sites/www/content/events/images/attend-flutter-events.png new file mode 100644 index 00000000000..113aa2238fb Binary files /dev/null and b/sites/www/content/events/images/attend-flutter-events.png differ diff --git a/sites/www/content/events/images/calendar/ai426.png b/sites/www/content/events/images/calendar/ai426.png new file mode 100644 index 00000000000..b80c65a4122 Binary files /dev/null and b/sites/www/content/events/images/calendar/ai426.png differ diff --git a/sites/www/content/events/images/calendar/allthingsopen26.svg b/sites/www/content/events/images/calendar/allthingsopen26.svg new file mode 100644 index 00000000000..0fdc847ff40 --- /dev/null +++ b/sites/www/content/events/images/calendar/allthingsopen26.svg @@ -0,0 +1,87 @@ + + + + + diff --git a/sites/www/content/events/images/calendar/config26.png b/sites/www/content/events/images/calendar/config26.png new file mode 100644 index 00000000000..a78f6a89038 Binary files /dev/null and b/sites/www/content/events/images/calendar/config26.png differ diff --git a/sites/www/content/events/images/calendar/flutter_friends.png b/sites/www/content/events/images/calendar/flutter_friends.png new file mode 100644 index 00000000000..2e78a64c55d Binary files /dev/null and b/sites/www/content/events/images/calendar/flutter_friends.png differ diff --git a/sites/www/content/events/images/calendar/fluttercon.png b/sites/www/content/events/images/calendar/fluttercon.png new file mode 100644 index 00000000000..869cd461034 Binary files /dev/null and b/sites/www/content/events/images/calendar/fluttercon.png differ diff --git a/sites/www/content/events/images/calendar/flutterconf.png b/sites/www/content/events/images/calendar/flutterconf.png new file mode 100644 index 00000000000..55c6727a0bf Binary files /dev/null and b/sites/www/content/events/images/calendar/flutterconf.png differ diff --git a/sites/www/content/events/images/calendar/flutterconflatam26.png b/sites/www/content/events/images/calendar/flutterconflatam26.png new file mode 100644 index 00000000000..72f7a05a7f2 Binary files /dev/null and b/sites/www/content/events/images/calendar/flutterconflatam26.png differ diff --git a/sites/www/content/events/images/calendar/flutterflow.png b/sites/www/content/events/images/calendar/flutterflow.png new file mode 100644 index 00000000000..8d0e66f96fc Binary files /dev/null and b/sites/www/content/events/images/calendar/flutterflow.png differ diff --git a/sites/www/content/events/images/calendar/fluttertechsummit.png b/sites/www/content/events/images/calendar/fluttertechsummit.png new file mode 100644 index 00000000000..7712722675a Binary files /dev/null and b/sites/www/content/events/images/calendar/fluttertechsummit.png differ diff --git a/sites/www/content/events/images/calendar/fluttertechsummit26.png b/sites/www/content/events/images/calendar/fluttertechsummit26.png new file mode 100644 index 00000000000..b7439f60c7e Binary files /dev/null and b/sites/www/content/events/images/calendar/fluttertechsummit26.png differ diff --git a/sites/www/content/events/images/calendar/gfd26.png b/sites/www/content/events/images/calendar/gfd26.png new file mode 100644 index 00000000000..35498e2c26d Binary files /dev/null and b/sites/www/content/events/images/calendar/gfd26.png differ diff --git a/sites/www/content/events/images/calendar/io26.png b/sites/www/content/events/images/calendar/io26.png new file mode 100644 index 00000000000..33e17f4b004 Binary files /dev/null and b/sites/www/content/events/images/calendar/io26.png differ diff --git a/sites/www/content/events/images/calendar/kaigi.png b/sites/www/content/events/images/calendar/kaigi.png new file mode 100644 index 00000000000..a0cf240ada0 Binary files /dev/null and b/sites/www/content/events/images/calendar/kaigi.png differ diff --git a/sites/www/content/events/images/calendar/mdevcamp26.png b/sites/www/content/events/images/calendar/mdevcamp26.png new file mode 100644 index 00000000000..ed7f4255605 Binary files /dev/null and b/sites/www/content/events/images/calendar/mdevcamp26.png differ diff --git a/sites/www/content/events/images/calendar/next26.gif b/sites/www/content/events/images/calendar/next26.gif new file mode 100644 index 00000000000..9e1744ffd77 Binary files /dev/null and b/sites/www/content/events/images/calendar/next26.gif differ diff --git a/sites/www/content/events/images/calendar/nextapp26.png b/sites/www/content/events/images/calendar/nextapp26.png new file mode 100644 index 00000000000..e3dcd742927 Binary files /dev/null and b/sites/www/content/events/images/calendar/nextapp26.png differ diff --git a/sites/www/content/events/images/calendar/render26.svg b/sites/www/content/events/images/calendar/render26.svg new file mode 100644 index 00000000000..d49f08e7d93 --- /dev/null +++ b/sites/www/content/events/images/calendar/render26.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/sites/www/content/events/images/featured/flutter_friends-featured.png b/sites/www/content/events/images/featured/flutter_friends-featured.png new file mode 100644 index 00000000000..2e78a64c55d Binary files /dev/null and b/sites/www/content/events/images/featured/flutter_friends-featured.png differ diff --git a/sites/www/content/events/images/featured/fluttercon-featured.avif b/sites/www/content/events/images/featured/fluttercon-featured.avif new file mode 100644 index 00000000000..f36c884f58c Binary files /dev/null and b/sites/www/content/events/images/featured/fluttercon-featured.avif differ diff --git a/sites/www/content/events/images/featured/flutterconflatam26-featured.png b/sites/www/content/events/images/featured/flutterconflatam26-featured.png new file mode 100644 index 00000000000..72f7a05a7f2 Binary files /dev/null and b/sites/www/content/events/images/featured/flutterconflatam26-featured.png differ diff --git a/sites/www/content/events/images/featured/io-featured.gif b/sites/www/content/events/images/featured/io-featured.gif new file mode 100644 index 00000000000..a35f28759fd Binary files /dev/null and b/sites/www/content/events/images/featured/io-featured.gif differ diff --git a/sites/www/content/events/images/featured/nextapp-featured.png b/sites/www/content/events/images/featured/nextapp-featured.png new file mode 100644 index 00000000000..e6b73fcc932 Binary files /dev/null and b/sites/www/content/events/images/featured/nextapp-featured.png differ diff --git a/sites/www/content/events/images/get-involved-home.png b/sites/www/content/events/images/get-involved-home.png new file mode 100644 index 00000000000..83a7399febe Binary files /dev/null and b/sites/www/content/events/images/get-involved-home.png differ diff --git a/sites/www/content/events/images/post-event-home.png b/sites/www/content/events/images/post-event-home.png new file mode 100644 index 00000000000..510c8064b96 Binary files /dev/null and b/sites/www/content/events/images/post-event-home.png differ diff --git a/sites/www/content/events/index.md b/sites/www/content/events/index.md new file mode 100644 index 00000000000..86df13a8f96 --- /dev/null +++ b/sites/www/content/events/index.md @@ -0,0 +1,8 @@ +--- +title: Events +bodyTags: interior events +description: View upcoming Flutter events and view content from previous events. +publishDate: "2021-10-21" +--- + + diff --git a/sites/www/content/flip/flip-banner.png b/sites/www/content/flip/flip-banner.png new file mode 100644 index 00000000000..00d97f3ec8b Binary files /dev/null and b/sites/www/content/flip/flip-banner.png differ diff --git a/sites/www/content/flip/index.md b/sites/www/content/flip/index.md new file mode 100644 index 00000000000..fb7046fd984 --- /dev/null +++ b/sites/www/content/flip/index.md @@ -0,0 +1,8 @@ +--- +title: I/O FLIP +bodyTags: interior +description: I/O FLIP is a modern AI take on a battle card game that uses generative AI to create custom cards for players to challenge each other. It was created to inspire developers to experiment with what is possible with generative AI + Google tools. Character images are generated with DreamBooth on Muse, and descriptions were generated using the PaLM API. Created in Flutter, it uses a suite of Firebase and Google Cloud tools for hosting and sharing. +publishDate: "2023-05-04" +--- + + diff --git a/sites/www/content/games/data/featured.yaml b/sites/www/content/games/data/featured.yaml new file mode 100644 index 00000000000..19181373fb0 --- /dev/null +++ b/sites/www/content/games/data/featured.yaml @@ -0,0 +1,37 @@ +# This file contains the source data used to populate the +# "Flutter games" carousel on the https://flutter.dev/games page. +# +# Don't directly open PRs with additions to this list. +# +# If you have a game you'd like to be listed, +# please open an issue with more information. +# Generally, it is preferred for entries to have a +# case study or video of their Flutter usage published. + +- title: Google I/O Flip + url: /flip + image: images/featured/flip.png + +- title: PUBG Mobile + url: /showcase/pubg-mobile + image: images/featured/pubg.jpg + +- title: Google I/O Pinball + url: https://blog.flutter.dev/i-o-pinball-powered-by-flutter-and-firebase-d22423f3f5d + image: images/featured/pinball.png + +- title: Super TicTacToe + url: https://www.youtube.com/watch?v=zGgeBNiRy-8 + image: images/featured/tictactoe.png + +- title: Wallace & Gromit AR + url: /showcase/wallace-gromit-ar + image: images/featured/wallace-gromit.jpg + +- title: 4 Pics 1 Word + url: /showcase/lotum + image: images/featured/4pics1word.png + +- title: Doodle Dash + url: https://codelabs.developers.google.com/codelabs/flutter-flame-game#0 + image: images/featured/doodle-dash.gif diff --git a/sites/www/content/games/data/integrations.yaml b/sites/www/content/games/data/integrations.yaml new file mode 100644 index 00000000000..7b5f415c4fe --- /dev/null +++ b/sites/www/content/games/data/integrations.yaml @@ -0,0 +1,37 @@ +# This file contains the source data used to populate the +# "Flutter games resources" carousel on the https://flutter.dev/games page. +# +# Don't directly open PRs with additions to this list. +# +# If you have a resource or integration you'd like to be listed, +# please open an issue with more information. + +- title: Ads with Google + description: Reach a wider audience and maximize ad revenue with Flutter + url: https://docs.flutter.dev/cookbook/plugins/google-mobile-ads + image: images/integration/ads.png + +- title: In-app purchases + description: Build in-app revenue with Google Play and Apple App Store support for Flutter + url: https://codelabs.developers.google.com/codelabs/flutter-in-app-purchases#0 + image: images/integration/iap.png + +- title: Leaderboards & badges + description: Increase user engagement with a leaderboard and achievements + url: https://docs.flutter.dev/cookbook/games/achievements-leaderboard + image: images/integration/leaderboards.png + +- title: User authentication + description: Securely save user data and personalize user experiencing with Firebase Auth + url: https://firebase.google.com/codelabs/firebase-auth-in-flutter-apps#0 + image: images/integration/auth.png + +- title: Crash reporting + description: Get clear and actionable insights into game issues with Crash Reporting + url: https://firebase.flutter.dev/docs/crashlytics/overview/ + image: images/integration/crash-reporting.png + +- title: Multiplayer support + description: Implement multiplayer capabilities in your game via Cloud Firestore + url: https://docs.flutter.dev/cookbook/games/firestore-multiplayer + image: images/integration/multiplayer.png diff --git a/sites/www/content/games/images/cloud-plus-firebase.png b/sites/www/content/games/images/cloud-plus-firebase.png new file mode 100644 index 00000000000..be6969ee6aa Binary files /dev/null and b/sites/www/content/games/images/cloud-plus-firebase.png differ diff --git a/sites/www/content/games/images/dash-demo.png b/sites/www/content/games/images/dash-demo.png new file mode 100644 index 00000000000..004c91a323b Binary files /dev/null and b/sites/www/content/games/images/dash-demo.png differ diff --git a/sites/www/content/games/images/developer-story.gif b/sites/www/content/games/images/developer-story.gif new file mode 100644 index 00000000000..3445d88a0f5 Binary files /dev/null and b/sites/www/content/games/images/developer-story.gif differ diff --git a/sites/www/content/games/images/developer-story.png b/sites/www/content/games/images/developer-story.png new file mode 100644 index 00000000000..527012931d9 Binary files /dev/null and b/sites/www/content/games/images/developer-story.png differ diff --git a/sites/www/content/games/images/featured/4pics1word.png b/sites/www/content/games/images/featured/4pics1word.png new file mode 100644 index 00000000000..3700986ab6b Binary files /dev/null and b/sites/www/content/games/images/featured/4pics1word.png differ diff --git a/sites/www/content/games/images/featured/doodle-dash.gif b/sites/www/content/games/images/featured/doodle-dash.gif new file mode 100644 index 00000000000..c71d8e812a5 Binary files /dev/null and b/sites/www/content/games/images/featured/doodle-dash.gif differ diff --git a/sites/www/content/games/images/featured/flip.png b/sites/www/content/games/images/featured/flip.png new file mode 100644 index 00000000000..9af9edb7db4 Binary files /dev/null and b/sites/www/content/games/images/featured/flip.png differ diff --git a/sites/www/content/games/images/featured/pinball.png b/sites/www/content/games/images/featured/pinball.png new file mode 100644 index 00000000000..13a96b282a3 Binary files /dev/null and b/sites/www/content/games/images/featured/pinball.png differ diff --git a/sites/www/content/games/images/featured/pubg.jpg b/sites/www/content/games/images/featured/pubg.jpg new file mode 100644 index 00000000000..6a58f1ff569 Binary files /dev/null and b/sites/www/content/games/images/featured/pubg.jpg differ diff --git a/sites/www/content/games/images/featured/tictactoe.png b/sites/www/content/games/images/featured/tictactoe.png new file mode 100644 index 00000000000..1ef7cdb522f Binary files /dev/null and b/sites/www/content/games/images/featured/tictactoe.png differ diff --git a/sites/www/content/games/images/featured/wallace-gromit.jpg b/sites/www/content/games/images/featured/wallace-gromit.jpg new file mode 100644 index 00000000000..f3ed7f9eee1 Binary files /dev/null and b/sites/www/content/games/images/featured/wallace-gromit.jpg differ diff --git a/sites/www/content/games/images/flame.png b/sites/www/content/games/images/flame.png new file mode 100644 index 00000000000..c90912fc8c1 Binary files /dev/null and b/sites/www/content/games/images/flame.png differ diff --git a/sites/www/content/games/images/flip/icon_code.png b/sites/www/content/games/images/flip/icon_code.png new file mode 100644 index 00000000000..1dbe5bb9ec4 Binary files /dev/null and b/sites/www/content/games/images/flip/icon_code.png differ diff --git a/sites/www/content/games/images/flip/icon_how.png b/sites/www/content/games/images/flip/icon_how.png new file mode 100644 index 00000000000..556b290f90f Binary files /dev/null and b/sites/www/content/games/images/flip/icon_how.png differ diff --git a/sites/www/content/games/images/flip/icon_why.png b/sites/www/content/games/images/flip/icon_why.png new file mode 100644 index 00000000000..95b8ab2cd0c Binary files /dev/null and b/sites/www/content/games/images/flip/icon_why.png differ diff --git a/sites/www/content/games/images/free-open-source.png b/sites/www/content/games/images/free-open-source.png new file mode 100644 index 00000000000..f8779f8d61c Binary files /dev/null and b/sites/www/content/games/images/free-open-source.png differ diff --git a/sites/www/content/games/images/games-header-debertz.png b/sites/www/content/games/images/games-header-debertz.png new file mode 100644 index 00000000000..94bd985b434 Binary files /dev/null and b/sites/www/content/games/images/games-header-debertz.png differ diff --git a/sites/www/content/games/images/games-header-landover.png b/sites/www/content/games/images/games-header-landover.png new file mode 100644 index 00000000000..d68c1cdd88b Binary files /dev/null and b/sites/www/content/games/images/games-header-landover.png differ diff --git a/sites/www/content/games/images/games-header-trivia-crack.png b/sites/www/content/games/images/games-header-trivia-crack.png new file mode 100644 index 00000000000..94936232951 Binary files /dev/null and b/sites/www/content/games/images/games-header-trivia-crack.png differ diff --git a/sites/www/content/games/images/games-header.gif b/sites/www/content/games/images/games-header.gif new file mode 100644 index 00000000000..08ce16152d4 Binary files /dev/null and b/sites/www/content/games/images/games-header.gif differ diff --git a/sites/www/content/games/images/get-started-docs.png b/sites/www/content/games/images/get-started-docs.png new file mode 100644 index 00000000000..7c4c4d2d5fd Binary files /dev/null and b/sites/www/content/games/images/get-started-docs.png differ diff --git a/sites/www/content/games/images/google-ads-icon.png b/sites/www/content/games/images/google-ads-icon.png new file mode 100644 index 00000000000..cd0aee12a6b Binary files /dev/null and b/sites/www/content/games/images/google-ads-icon.png differ diff --git a/sites/www/content/games/images/integration/ads.png b/sites/www/content/games/images/integration/ads.png new file mode 100644 index 00000000000..5c324828c4c Binary files /dev/null and b/sites/www/content/games/images/integration/ads.png differ diff --git a/sites/www/content/games/images/integration/auth.png b/sites/www/content/games/images/integration/auth.png new file mode 100644 index 00000000000..e238e6a4b17 Binary files /dev/null and b/sites/www/content/games/images/integration/auth.png differ diff --git a/sites/www/content/games/images/integration/crash-reporting.png b/sites/www/content/games/images/integration/crash-reporting.png new file mode 100644 index 00000000000..008cdc60d79 Binary files /dev/null and b/sites/www/content/games/images/integration/crash-reporting.png differ diff --git a/sites/www/content/games/images/integration/iap.png b/sites/www/content/games/images/integration/iap.png new file mode 100644 index 00000000000..e7e3126bbc1 Binary files /dev/null and b/sites/www/content/games/images/integration/iap.png differ diff --git a/sites/www/content/games/images/integration/leaderboards.png b/sites/www/content/games/images/integration/leaderboards.png new file mode 100644 index 00000000000..94ccc83f4c5 Binary files /dev/null and b/sites/www/content/games/images/integration/leaderboards.png differ diff --git a/sites/www/content/games/images/integration/multiplayer.png b/sites/www/content/games/images/integration/multiplayer.png new file mode 100644 index 00000000000..cbee4955b2c Binary files /dev/null and b/sites/www/content/games/images/integration/multiplayer.png differ diff --git a/sites/www/content/games/images/join-community.png b/sites/www/content/games/images/join-community.png new file mode 100644 index 00000000000..499e7999ada Binary files /dev/null and b/sites/www/content/games/images/join-community.png differ diff --git a/sites/www/content/games/images/multiplatform-games.png b/sites/www/content/games/images/multiplatform-games.png new file mode 100644 index 00000000000..e7193d9860c Binary files /dev/null and b/sites/www/content/games/images/multiplatform-games.png differ diff --git a/sites/www/content/games/images/packages-integrations.png b/sites/www/content/games/images/packages-integrations.png new file mode 100644 index 00000000000..d496dac9364 Binary files /dev/null and b/sites/www/content/games/images/packages-integrations.png differ diff --git a/sites/www/content/games/images/super-dash-demo.gif b/sites/www/content/games/images/super-dash-demo.gif new file mode 100644 index 00000000000..cf42c72b42c Binary files /dev/null and b/sites/www/content/games/images/super-dash-demo.gif differ diff --git a/sites/www/content/games/images/template-basic.gif b/sites/www/content/games/images/template-basic.gif new file mode 100644 index 00000000000..4a95fd5aa5c Binary files /dev/null and b/sites/www/content/games/images/template-basic.gif differ diff --git a/sites/www/content/games/images/template-card-game.gif b/sites/www/content/games/images/template-card-game.gif new file mode 100644 index 00000000000..58f21d57fcc Binary files /dev/null and b/sites/www/content/games/images/template-card-game.gif differ diff --git a/sites/www/content/games/images/template-endless-runner.gif b/sites/www/content/games/images/template-endless-runner.gif new file mode 100644 index 00000000000..be736f6e91f Binary files /dev/null and b/sites/www/content/games/images/template-endless-runner.gif differ diff --git a/sites/www/content/games/images/tic-tac-toe-static.png b/sites/www/content/games/images/tic-tac-toe-static.png new file mode 100644 index 00000000000..26a7d728ed3 Binary files /dev/null and b/sites/www/content/games/images/tic-tac-toe-static.png differ diff --git a/sites/www/content/games/images/tic-tac-toe.mp4 b/sites/www/content/games/images/tic-tac-toe.mp4 new file mode 100644 index 00000000000..b2307401a12 Binary files /dev/null and b/sites/www/content/games/images/tic-tac-toe.mp4 differ diff --git a/sites/www/content/games/images/watch-video.png b/sites/www/content/games/images/watch-video.png new file mode 100644 index 00000000000..4f7eb5dfc1a Binary files /dev/null and b/sites/www/content/games/images/watch-video.png differ diff --git a/sites/www/content/games/index.md b/sites/www/content/games/index.md new file mode 100644 index 00000000000..d3dfd2cc786 --- /dev/null +++ b/sites/www/content/games/index.md @@ -0,0 +1,8 @@ +--- +title: Games +bodyTags: interior games +description: Free & open source multiplatform 2D game development in Flutter. +publishDate: "2022-05-10" +--- + + diff --git a/sites/www/content/google-integrations/images/firebase.png b/sites/www/content/google-integrations/images/firebase.png new file mode 100644 index 00000000000..8f94eb52183 Binary files /dev/null and b/sites/www/content/google-integrations/images/firebase.png differ diff --git a/sites/www/content/google-integrations/images/gemini.png b/sites/www/content/google-integrations/images/gemini.png new file mode 100644 index 00000000000..426b7fbedaa Binary files /dev/null and b/sites/www/content/google-integrations/images/gemini.png differ diff --git a/sites/www/content/google-integrations/images/google-ads-mob.png b/sites/www/content/google-integrations/images/google-ads-mob.png new file mode 100644 index 00000000000..c3af7d805ea Binary files /dev/null and b/sites/www/content/google-integrations/images/google-ads-mob.png differ diff --git a/sites/www/content/google-integrations/images/google-integrations-dash.png b/sites/www/content/google-integrations/images/google-integrations-dash.png new file mode 100644 index 00000000000..15d652e32cf Binary files /dev/null and b/sites/www/content/google-integrations/images/google-integrations-dash.png differ diff --git a/sites/www/content/google-integrations/images/google-maps.png b/sites/www/content/google-integrations/images/google-maps.png new file mode 100644 index 00000000000..b9778718203 Binary files /dev/null and b/sites/www/content/google-integrations/images/google-maps.png differ diff --git a/sites/www/content/google-integrations/images/google-pay-wallet.png b/sites/www/content/google-integrations/images/google-pay-wallet.png new file mode 100644 index 00000000000..446c381e683 Binary files /dev/null and b/sites/www/content/google-integrations/images/google-pay-wallet.png differ diff --git a/sites/www/content/google-integrations/images/google-play.png b/sites/www/content/google-integrations/images/google-play.png new file mode 100644 index 00000000000..118e1221a87 Binary files /dev/null and b/sites/www/content/google-integrations/images/google-play.png differ diff --git a/sites/www/content/google-integrations/index.md b/sites/www/content/google-integrations/index.md new file mode 100644 index 00000000000..0df3aeed1b5 --- /dev/null +++ b/sites/www/content/google-integrations/index.md @@ -0,0 +1,8 @@ +--- +title: Google integration +bodyTags: interior integrations +description: Google products that integrate with Flutter. +publishDate: "2024-05-02" +--- + + diff --git a/sites/www/content/home/images/banner-megaphone.png b/sites/www/content/home/images/banner-megaphone.png new file mode 100644 index 00000000000..3ea5213d01a Binary files /dev/null and b/sites/www/content/home/images/banner-megaphone.png differ diff --git a/sites/www/content/home/images/developer-experience.jpg b/sites/www/content/home/images/developer-experience.jpg new file mode 100644 index 00000000000..789f86b03e5 Binary files /dev/null and b/sites/www/content/home/images/developer-experience.jpg differ diff --git a/sites/www/content/home/images/development.jpg b/sites/www/content/home/images/development.jpg new file mode 100644 index 00000000000..4851438996b Binary files /dev/null and b/sites/www/content/home/images/development.jpg differ diff --git a/sites/www/content/home/images/fast.png b/sites/www/content/home/images/fast.png new file mode 100644 index 00000000000..bb0f531b14e Binary files /dev/null and b/sites/www/content/home/images/fast.png differ diff --git a/sites/www/content/home/images/feature-fast.mp4 b/sites/www/content/home/images/feature-fast.mp4 new file mode 100644 index 00000000000..28ed37d90c9 Binary files /dev/null and b/sites/www/content/home/images/feature-fast.mp4 differ diff --git a/sites/www/content/home/images/feature-flexible.mp4 b/sites/www/content/home/images/feature-flexible.mp4 new file mode 100644 index 00000000000..613f7ab1b32 Binary files /dev/null and b/sites/www/content/home/images/feature-flexible.mp4 differ diff --git a/sites/www/content/home/images/feature-productive.mp4 b/sites/www/content/home/images/feature-productive.mp4 new file mode 100644 index 00000000000..1f44f6aff0d Binary files /dev/null and b/sites/www/content/home/images/feature-productive.mp4 differ diff --git a/sites/www/content/home/images/flexible.png b/sites/www/content/home/images/flexible.png new file mode 100644 index 00000000000..36daad56257 Binary files /dev/null and b/sites/www/content/home/images/flexible.png differ diff --git a/sites/www/content/home/images/get-started.jpg b/sites/www/content/home/images/get-started.jpg new file mode 100644 index 00000000000..81b0a7722a3 Binary files /dev/null and b/sites/www/content/home/images/get-started.jpg differ diff --git a/sites/www/content/home/images/gpay-developer-story.png b/sites/www/content/home/images/gpay-developer-story.png new file mode 100644 index 00000000000..c0ec6d9837a Binary files /dev/null and b/sites/www/content/home/images/gpay-developer-story.png differ diff --git a/sites/www/content/home/images/hero/google-assistant-tablet.png b/sites/www/content/home/images/hero/google-assistant-tablet.png new file mode 100644 index 00000000000..977debbbfce Binary files /dev/null and b/sites/www/content/home/images/hero/google-assistant-tablet.png differ diff --git a/sites/www/content/home/images/hero/hero-bmw-mobile.png b/sites/www/content/home/images/hero/hero-bmw-mobile.png new file mode 100644 index 00000000000..0c247b9262c Binary files /dev/null and b/sites/www/content/home/images/hero/hero-bmw-mobile.png differ diff --git a/sites/www/content/home/images/hero/hero-the-debertz.png b/sites/www/content/home/images/hero/hero-the-debertz.png new file mode 100644 index 00000000000..bf81900e346 Binary files /dev/null and b/sites/www/content/home/images/hero/hero-the-debertz.png differ diff --git a/sites/www/content/home/images/hero/hero-trivia-crack.png b/sites/www/content/home/images/hero/hero-trivia-crack.png new file mode 100644 index 00000000000..d2d9a528378 Binary files /dev/null and b/sites/www/content/home/images/hero/hero-trivia-crack.png differ diff --git a/sites/www/content/home/images/hero/mgm-app.jpg b/sites/www/content/home/images/hero/mgm-app.jpg new file mode 100644 index 00000000000..a7417f6b270 Binary files /dev/null and b/sites/www/content/home/images/hero/mgm-app.jpg differ diff --git a/sites/www/content/home/images/hero/movement-app.png b/sites/www/content/home/images/hero/movement-app.png new file mode 100644 index 00000000000..941c8dfb3f5 Binary files /dev/null and b/sites/www/content/home/images/hero/movement-app.png differ diff --git a/sites/www/content/home/images/hero/nu-app.png b/sites/www/content/home/images/hero/nu-app.png new file mode 100644 index 00000000000..55eb59cb022 Binary files /dev/null and b/sites/www/content/home/images/hero/nu-app.png differ diff --git a/sites/www/content/home/images/hero/sua-musica-app.png b/sites/www/content/home/images/hero/sua-musica-app.png new file mode 100644 index 00000000000..adf8bcd4849 Binary files /dev/null and b/sites/www/content/home/images/hero/sua-musica-app.png differ diff --git a/sites/www/content/home/images/productive.png b/sites/www/content/home/images/productive.png new file mode 100644 index 00000000000..17480fcb6da Binary files /dev/null and b/sites/www/content/home/images/productive.png differ diff --git a/sites/www/content/home/images/seamless-integrations-home.png b/sites/www/content/home/images/seamless-integrations-home.png new file mode 100644 index 00000000000..c223e01dcc8 Binary files /dev/null and b/sites/www/content/home/images/seamless-integrations-home.png differ diff --git a/sites/www/content/home/images/stable-and-reliable.jpg b/sites/www/content/home/images/stable-and-reliable.jpg new file mode 100644 index 00000000000..9e11942d0bb Binary files /dev/null and b/sites/www/content/home/images/stable-and-reliable.jpg differ diff --git a/sites/www/content/home/latest_news.yaml b/sites/www/content/home/latest_news.yaml new file mode 100644 index 00000000000..0169d70b25d --- /dev/null +++ b/sites/www/content/home/latest_news.yaml @@ -0,0 +1,50 @@ +# This file contains the source data used to populate the +# "Latest news" carousel at the bottom of the site homepage. +# +# Generally this is reserved for official Dart and Flutter blog posts. +# If you have some other news or posts you think should be added, +# please first open an issue with relevant information. + +- title: "What's new in Flutter 3.41 and Dart 3.11" + url: "https://blog.flutter.dev/whats-new-in-flutter-3-41-302ec140e632" + image: "/news/images/featured/whats-new-flutter-3-41-dart-3-11.png" + +- title: "What's new in Flutter 3.35" + url: "https://blog.flutter.dev/whats-new-in-flutter-3-35-c58ef72e3766" + image: "/news/images/featured/whats-new-flutter-3-35.png" + +- title: "Announcing Dart 3.9" + url: "https://blog.dart.dev/announcing-dart-3-9-ba49e8f38298" + image: "/news/images/featured/announcing-dart-3-9.png" + +- title: "Dart & Flutter momentum at Google I/O 2025" + url: "https://blog.flutter.dev/dart-flutter-momentum-at-google-i-o-2025-4863aa4f84a4" + image: "/news/images/featured/flutter-at-io-2025.webp" + +- title: "What’s new in Flutter 3.32" + url: "https://blog.flutter.dev/whats-new-in-flutter-3-32-40c1086bab6e" + image: "/news/images/featured/whats-new-flutter-3-32.webp" + +- title: "Announcing Dart 3.8" + url: "https://blog.dart.dev/announcing-dart-3-8-724eaaec9f47" + image: "/news/images/featured/announcing-dart-3-8.png" + +- title: "Gemini in Android Studio now speaks fluent Flutter!" + url: "https://blog.flutter.dev/gemini-in-android-studio-now-speaks-fluent-flutter-915dfec98274" + image: "/news/images/featured/gemini-android-studio-flutter.png" + +- title: "Flutter’s path towards seamless interop" + url: "https://blog.flutter.dev/flutters-path-towards-seamless-interop-4bf7d4579d9a" + image: "/news/images/featured/flutter_logo.png" + +- title: "Announcing Dart 3.7" + url: "https://blog.dart.dev/announcing-dart-3-7-bf864a1b195c" + image: "/news/images/featured/announcing-dart-3-7.png" + +- title: "Sharing Flutter’s 2024 roadmap" + url: "https://blog.flutter.dev/sharing-flutters-2024-roadmap-22debd2bbd22" + image: "/news/images/featured/flutter-2024-roadmap.png" + +- title: "Announcing Flutter 3.38 & Dart 3.10" + url: "https://blog.flutter.dev/announcing-flutter-3-38-dart-3-10-building-the-future-of-apps-503429eeb685" + image: "/news/images/featured/announcing-flutter-3-38-dart-3-10.png" diff --git a/sites/www/content/images/calendar/ffdc26.png b/sites/www/content/images/calendar/ffdc26.png new file mode 100644 index 00000000000..3f6a9a2315d Binary files /dev/null and b/sites/www/content/images/calendar/ffdc26.png differ diff --git a/sites/www/content/images/calendar/flutterconf26.png b/sites/www/content/images/calendar/flutterconf26.png new file mode 100644 index 00000000000..f9870d9be22 Binary files /dev/null and b/sites/www/content/images/calendar/flutterconf26.png differ diff --git a/sites/www/content/images/calendar/io26.png b/sites/www/content/images/calendar/io26.png new file mode 100644 index 00000000000..f9fd616ef85 Binary files /dev/null and b/sites/www/content/images/calendar/io26.png differ diff --git a/sites/www/content/images/calendar/next2026.png b/sites/www/content/images/calendar/next2026.png new file mode 100644 index 00000000000..be947b10075 Binary files /dev/null and b/sites/www/content/images/calendar/next2026.png differ diff --git a/sites/www/content/images/common/calendar.svg b/sites/www/content/images/common/calendar.svg new file mode 100644 index 00000000000..d69e50a347d --- /dev/null +++ b/sites/www/content/images/common/calendar.svg @@ -0,0 +1,3 @@ + + + diff --git a/sites/www/content/images/common/get-started-background.png b/sites/www/content/images/common/get-started-background.png new file mode 100644 index 00000000000..4f072ba885d Binary files /dev/null and b/sites/www/content/images/common/get-started-background.png differ diff --git a/sites/www/content/images/common/gps-location.svg b/sites/www/content/images/common/gps-location.svg new file mode 100644 index 00000000000..6a3df9b2c88 --- /dev/null +++ b/sites/www/content/images/common/gps-location.svg @@ -0,0 +1,3 @@ + + + diff --git a/sites/www/content/images/common/play-button.svg b/sites/www/content/images/common/play-button.svg new file mode 100644 index 00000000000..e3fea8a2133 --- /dev/null +++ b/sites/www/content/images/common/play-button.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/sites/www/content/images/common/powered-by-dart.svg b/sites/www/content/images/common/powered-by-dart.svg new file mode 100644 index 00000000000..aa9c0ecaff6 --- /dev/null +++ b/sites/www/content/images/common/powered-by-dart.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sites/www/content/images/common/try-flutter-background.png b/sites/www/content/images/common/try-flutter-background.png new file mode 100644 index 00000000000..23e5766c661 Binary files /dev/null and b/sites/www/content/images/common/try-flutter-background.png differ diff --git a/sites/www/content/images/favicon.png b/sites/www/content/images/favicon.png new file mode 100644 index 00000000000..2eb40016c20 Binary files /dev/null and b/sites/www/content/images/favicon.png differ diff --git a/sites/www/content/images/flutter-logo-mark-320x.png b/sites/www/content/images/flutter-logo-mark-320x.png new file mode 100644 index 00000000000..eccd90203f5 Binary files /dev/null and b/sites/www/content/images/flutter-logo-mark-320x.png differ diff --git a/sites/www/content/images/flutter-logo-sharing.png b/sites/www/content/images/flutter-logo-sharing.png new file mode 100644 index 00000000000..e214d686f4e Binary files /dev/null and b/sites/www/content/images/flutter-logo-sharing.png differ diff --git a/sites/www/content/images/flutter-logo-white.svg b/sites/www/content/images/flutter-logo-white.svg new file mode 100644 index 00000000000..cef778d6d8f --- /dev/null +++ b/sites/www/content/images/flutter-logo-white.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sites/www/content/images/flutter-logo.svg b/sites/www/content/images/flutter-logo.svg new file mode 100644 index 00000000000..dc7c6a7e461 --- /dev/null +++ b/sites/www/content/images/flutter-logo.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sites/www/content/images/notfound/404-dash.png b/sites/www/content/images/notfound/404-dash.png new file mode 100644 index 00000000000..53cc0127b07 Binary files /dev/null and b/sites/www/content/images/notfound/404-dash.png differ diff --git a/sites/www/content/images/third_party/_README.md b/sites/www/content/images/third_party/_README.md new file mode 100644 index 00000000000..055eed3dffd --- /dev/null +++ b/sites/www/content/images/third_party/_README.md @@ -0,0 +1,13 @@ +# Third-party assets + +This directory contains logos and images belonging to third-party companies, +used here with permission for showcasing or highlighting their Flutter usage. + +## License exception + +The assets in this directory are excluded from +this repository's standard license. + +These images and logos are the property of their respective owners. +To reuse, modify, redistribute, or use these assets in your own projects, +you must obtain permission from their respective owners. diff --git a/sites/www/content/images/third_party/logos/abbeyroad.svg b/sites/www/content/images/third_party/logos/abbeyroad.svg new file mode 100644 index 00000000000..7c1a1ee239d --- /dev/null +++ b/sites/www/content/images/third_party/logos/abbeyroad.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/sites/www/content/images/third_party/logos/alibaba.svg b/sites/www/content/images/third_party/logos/alibaba.svg new file mode 100644 index 00000000000..5718231269a --- /dev/null +++ b/sites/www/content/images/third_party/logos/alibaba.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sites/www/content/images/third_party/logos/baidu.svg b/sites/www/content/images/third_party/logos/baidu.svg new file mode 100644 index 00000000000..7a376df8d52 --- /dev/null +++ b/sites/www/content/images/third_party/logos/baidu.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/sites/www/content/images/third_party/logos/betterment.svg b/sites/www/content/images/third_party/logos/betterment.svg new file mode 100644 index 00000000000..e7abd2785c4 --- /dev/null +++ b/sites/www/content/images/third_party/logos/betterment.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/sites/www/content/images/third_party/logos/bmw.svg b/sites/www/content/images/third_party/logos/bmw.svg new file mode 100644 index 00000000000..d7e59db9496 --- /dev/null +++ b/sites/www/content/images/third_party/logos/bmw.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/sites/www/content/images/third_party/logos/bytedance.svg b/sites/www/content/images/third_party/logos/bytedance.svg new file mode 100644 index 00000000000..33570a280a1 --- /dev/null +++ b/sites/www/content/images/third_party/logos/bytedance.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/sites/www/content/images/third_party/logos/capitalone.svg b/sites/www/content/images/third_party/logos/capitalone.svg new file mode 100644 index 00000000000..1a34fa8f320 --- /dev/null +++ b/sites/www/content/images/third_party/logos/capitalone.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/sites/www/content/images/third_party/logos/crowdsource.svg b/sites/www/content/images/third_party/logos/crowdsource.svg new file mode 100644 index 00000000000..f9b5313b111 --- /dev/null +++ b/sites/www/content/images/third_party/logos/crowdsource.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/sites/www/content/images/third_party/logos/dream11.svg b/sites/www/content/images/third_party/logos/dream11.svg new file mode 100644 index 00000000000..da595a0dcf2 --- /dev/null +++ b/sites/www/content/images/third_party/logos/dream11.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/sites/www/content/images/third_party/logos/ebay.svg b/sites/www/content/images/third_party/logos/ebay.svg new file mode 100644 index 00000000000..8c64fe4c356 --- /dev/null +++ b/sites/www/content/images/third_party/logos/ebay.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/sites/www/content/images/third_party/logos/emaar.svg b/sites/www/content/images/third_party/logos/emaar.svg new file mode 100644 index 00000000000..0632d23e2e9 --- /dev/null +++ b/sites/www/content/images/third_party/logos/emaar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sites/www/content/images/third_party/logos/google.svg b/sites/www/content/images/third_party/logos/google.svg new file mode 100644 index 00000000000..68a1b77dd03 --- /dev/null +++ b/sites/www/content/images/third_party/logos/google.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/sites/www/content/images/third_party/logos/googleads.svg b/sites/www/content/images/third_party/logos/googleads.svg new file mode 100644 index 00000000000..4131a13c947 --- /dev/null +++ b/sites/www/content/images/third_party/logos/googleads.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sites/www/content/images/third_party/logos/googlepay.svg b/sites/www/content/images/third_party/logos/googlepay.svg new file mode 100644 index 00000000000..bbd28b502cb --- /dev/null +++ b/sites/www/content/images/third_party/logos/googlepay.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/sites/www/content/images/third_party/logos/grab.svg b/sites/www/content/images/third_party/logos/grab.svg new file mode 100644 index 00000000000..bba5547c3df --- /dev/null +++ b/sites/www/content/images/third_party/logos/grab.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/sites/www/content/images/third_party/logos/groupon.svg b/sites/www/content/images/third_party/logos/groupon.svg new file mode 100644 index 00000000000..b350cf41035 --- /dev/null +++ b/sites/www/content/images/third_party/logos/groupon.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/sites/www/content/images/third_party/logos/hamilton.svg b/sites/www/content/images/third_party/logos/hamilton.svg new file mode 100644 index 00000000000..b3cb2e95c53 --- /dev/null +++ b/sites/www/content/images/third_party/logos/hamilton.svg @@ -0,0 +1,110 @@ + + + + + diff --git a/sites/www/content/images/third_party/logos/irobot.svg b/sites/www/content/images/third_party/logos/irobot.svg new file mode 100644 index 00000000000..a6b00614642 --- /dev/null +++ b/sites/www/content/images/third_party/logos/irobot.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/sites/www/content/images/third_party/logos/kotak.svg b/sites/www/content/images/third_party/logos/kotak.svg new file mode 100644 index 00000000000..36a1892436f --- /dev/null +++ b/sites/www/content/images/third_party/logos/kotak.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + diff --git a/sites/www/content/images/third_party/logos/lotum.svg b/sites/www/content/images/third_party/logos/lotum.svg new file mode 100644 index 00000000000..08ea9f5fd4c --- /dev/null +++ b/sites/www/content/images/third_party/logos/lotum.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/sites/www/content/images/third_party/logos/mgm.svg b/sites/www/content/images/third_party/logos/mgm.svg new file mode 100644 index 00000000000..6823e75f974 --- /dev/null +++ b/sites/www/content/images/third_party/logos/mgm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sites/www/content/images/third_party/logos/nubank.svg b/sites/www/content/images/third_party/logos/nubank.svg new file mode 100644 index 00000000000..921335dce08 --- /dev/null +++ b/sites/www/content/images/third_party/logos/nubank.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + diff --git a/sites/www/content/images/third_party/logos/nytimes.svg b/sites/www/content/images/third_party/logos/nytimes.svg new file mode 100644 index 00000000000..13611dbca48 --- /dev/null +++ b/sites/www/content/images/third_party/logos/nytimes.svg @@ -0,0 +1,20 @@ + + + + + + + + + + diff --git a/sites/www/content/images/third_party/logos/philips-hue.png b/sites/www/content/images/third_party/logos/philips-hue.png new file mode 100644 index 00000000000..814704e7955 Binary files /dev/null and b/sites/www/content/images/third_party/logos/philips-hue.png differ diff --git a/sites/www/content/images/third_party/logos/philips.svg b/sites/www/content/images/third_party/logos/philips.svg new file mode 100644 index 00000000000..48b48e0f685 --- /dev/null +++ b/sites/www/content/images/third_party/logos/philips.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sites/www/content/images/third_party/logos/realtor.svg b/sites/www/content/images/third_party/logos/realtor.svg new file mode 100644 index 00000000000..d93bb9ba74e --- /dev/null +++ b/sites/www/content/images/third_party/logos/realtor.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + diff --git a/sites/www/content/images/third_party/logos/sonos.svg b/sites/www/content/images/third_party/logos/sonos.svg new file mode 100644 index 00000000000..b3810f4f29f --- /dev/null +++ b/sites/www/content/images/third_party/logos/sonos.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/sites/www/content/images/third_party/logos/square.svg b/sites/www/content/images/third_party/logos/square.svg new file mode 100644 index 00000000000..7f950875cf5 --- /dev/null +++ b/sites/www/content/images/third_party/logos/square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sites/www/content/images/third_party/logos/suamusica.svg b/sites/www/content/images/third_party/logos/suamusica.svg new file mode 100644 index 00000000000..e219435b334 --- /dev/null +++ b/sites/www/content/images/third_party/logos/suamusica.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/sites/www/content/images/third_party/logos/surface.svg b/sites/www/content/images/third_party/logos/surface.svg new file mode 100644 index 00000000000..b032963b35c --- /dev/null +++ b/sites/www/content/images/third_party/logos/surface.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/sites/www/content/images/third_party/logos/talabat.png b/sites/www/content/images/third_party/logos/talabat.png new file mode 100644 index 00000000000..2f9fbe23275 Binary files /dev/null and b/sites/www/content/images/third_party/logos/talabat.png differ diff --git a/sites/www/content/images/third_party/logos/tencent.svg b/sites/www/content/images/third_party/logos/tencent.svg new file mode 100644 index 00000000000..b8a66b7f5df --- /dev/null +++ b/sites/www/content/images/third_party/logos/tencent.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/sites/www/content/images/third_party/logos/toyota.svg b/sites/www/content/images/third_party/logos/toyota.svg new file mode 100644 index 00000000000..00baadb50a1 --- /dev/null +++ b/sites/www/content/images/third_party/logos/toyota.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sites/www/content/images/third_party/logos/ubuntu.svg b/sites/www/content/images/third_party/logos/ubuntu.svg new file mode 100644 index 00000000000..1e0cf775c3d --- /dev/null +++ b/sites/www/content/images/third_party/logos/ubuntu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sites/www/content/index.md b/sites/www/content/index.md new file mode 100644 index 00000000000..ee3392a7180 --- /dev/null +++ b/sites/www/content/index.md @@ -0,0 +1,8 @@ +--- +title: Flutter - Build apps for any screen +bodyTags: home +description: Flutter transforms the entire app development process. Build, test, and deploy beautiful mobile, web, desktop, and embedded apps from a single codebase. +publishDate: "2021-11-16" +--- + + diff --git a/sites/www/content/monetization/images/accepting-payments.png b/sites/www/content/monetization/images/accepting-payments.png new file mode 100644 index 00000000000..2aea7e4df80 Binary files /dev/null and b/sites/www/content/monetization/images/accepting-payments.png differ diff --git a/sites/www/content/monetization/images/ads-in-your-flutter-app.svg b/sites/www/content/monetization/images/ads-in-your-flutter-app.svg new file mode 100644 index 00000000000..26fd759a41a --- /dev/null +++ b/sites/www/content/monetization/images/ads-in-your-flutter-app.svg @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sites/www/content/monetization/images/ads.png b/sites/www/content/monetization/images/ads.png new file mode 100644 index 00000000000..8573d21a0e4 Binary files /dev/null and b/sites/www/content/monetization/images/ads.png differ diff --git a/sites/www/content/monetization/images/adsense-h5.png b/sites/www/content/monetization/images/adsense-h5.png new file mode 100644 index 00000000000..a201578cca6 Binary files /dev/null and b/sites/www/content/monetization/images/adsense-h5.png differ diff --git a/sites/www/content/monetization/images/building-flutter-business.png b/sites/www/content/monetization/images/building-flutter-business.png new file mode 100644 index 00000000000..0b9d18bb4df Binary files /dev/null and b/sites/www/content/monetization/images/building-flutter-business.png differ diff --git a/sites/www/content/monetization/images/icons/codelab.svg b/sites/www/content/monetization/images/icons/codelab.svg new file mode 100644 index 00000000000..c9b952e1413 --- /dev/null +++ b/sites/www/content/monetization/images/icons/codelab.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/sites/www/content/monetization/images/icons/flutter-ads-codelab-1.svg b/sites/www/content/monetization/images/icons/flutter-ads-codelab-1.svg new file mode 100644 index 00000000000..8eeb3c6979a --- /dev/null +++ b/sites/www/content/monetization/images/icons/flutter-ads-codelab-1.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/sites/www/content/monetization/images/icons/flutter-ads-codelab-2.svg b/sites/www/content/monetization/images/icons/flutter-ads-codelab-2.svg new file mode 100644 index 00000000000..91cb5140fb9 --- /dev/null +++ b/sites/www/content/monetization/images/icons/flutter-ads-codelab-2.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/sites/www/content/monetization/images/icons/get-started-in-docs.svg b/sites/www/content/monetization/images/icons/get-started-in-docs.svg new file mode 100644 index 00000000000..89a8ceb0181 --- /dev/null +++ b/sites/www/content/monetization/images/icons/get-started-in-docs.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/sites/www/content/monetization/images/icons/see-the-code.svg b/sites/www/content/monetization/images/icons/see-the-code.svg new file mode 100644 index 00000000000..e54e27f9db0 --- /dev/null +++ b/sites/www/content/monetization/images/icons/see-the-code.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/sites/www/content/monetization/images/icons/see-the-sample.svg b/sites/www/content/monetization/images/icons/see-the-sample.svg new file mode 100644 index 00000000000..437a2de65a0 --- /dev/null +++ b/sites/www/content/monetization/images/icons/see-the-sample.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/sites/www/content/monetization/images/icons/watch-the-video.svg b/sites/www/content/monetization/images/icons/watch-the-video.svg new file mode 100644 index 00000000000..7f7dee806e5 --- /dev/null +++ b/sites/www/content/monetization/images/icons/watch-the-video.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/sites/www/content/monetization/images/ima-sdk.png b/sites/www/content/monetization/images/ima-sdk.png new file mode 100644 index 00000000000..c059f7d4d31 Binary files /dev/null and b/sites/www/content/monetization/images/ima-sdk.png differ diff --git a/sites/www/content/monetization/images/in-app-purchases-1.png b/sites/www/content/monetization/images/in-app-purchases-1.png new file mode 100644 index 00000000000..3e62943b55b Binary files /dev/null and b/sites/www/content/monetization/images/in-app-purchases-1.png differ diff --git a/sites/www/content/monetization/images/in-app-purchases.png b/sites/www/content/monetization/images/in-app-purchases.png new file mode 100644 index 00000000000..e4f9b4d5bce Binary files /dev/null and b/sites/www/content/monetization/images/in-app-purchases.png differ diff --git a/sites/www/content/monetization/images/payments.png b/sites/www/content/monetization/images/payments.png new file mode 100644 index 00000000000..2b829e7a688 Binary files /dev/null and b/sites/www/content/monetization/images/payments.png differ diff --git a/sites/www/content/monetization/index.md b/sites/www/content/monetization/index.md new file mode 100644 index 00000000000..68644d469c9 --- /dev/null +++ b/sites/www/content/monetization/index.md @@ -0,0 +1,8 @@ +--- +title: Monetization +bodyTags: interior monetization +description: Explore our suite of integrations with monetization features to grow your Flutter business. +publishDate: "2021-10-21" +--- + + diff --git a/sites/www/content/news/images/featured/announcing-dart-3-7.png b/sites/www/content/news/images/featured/announcing-dart-3-7.png new file mode 100644 index 00000000000..18b970b5169 Binary files /dev/null and b/sites/www/content/news/images/featured/announcing-dart-3-7.png differ diff --git a/sites/www/content/news/images/featured/announcing-dart-3-8.png b/sites/www/content/news/images/featured/announcing-dart-3-8.png new file mode 100644 index 00000000000..a632b8a4282 Binary files /dev/null and b/sites/www/content/news/images/featured/announcing-dart-3-8.png differ diff --git a/sites/www/content/news/images/featured/announcing-dart-3-9.png b/sites/www/content/news/images/featured/announcing-dart-3-9.png new file mode 100644 index 00000000000..ab2b08d088c Binary files /dev/null and b/sites/www/content/news/images/featured/announcing-dart-3-9.png differ diff --git a/sites/www/content/news/images/featured/announcing-flutter-3-38-dart-3-10.png b/sites/www/content/news/images/featured/announcing-flutter-3-38-dart-3-10.png new file mode 100644 index 00000000000..f23d03d136a Binary files /dev/null and b/sites/www/content/news/images/featured/announcing-flutter-3-38-dart-3-10.png differ diff --git a/sites/www/content/news/images/featured/flutter-2024-roadmap.png b/sites/www/content/news/images/featured/flutter-2024-roadmap.png new file mode 100644 index 00000000000..41c7cc632c1 Binary files /dev/null and b/sites/www/content/news/images/featured/flutter-2024-roadmap.png differ diff --git a/sites/www/content/news/images/featured/flutter-at-io-2025.webp b/sites/www/content/news/images/featured/flutter-at-io-2025.webp new file mode 100644 index 00000000000..e28c6e87252 Binary files /dev/null and b/sites/www/content/news/images/featured/flutter-at-io-2025.webp differ diff --git a/sites/www/content/news/images/featured/flutter_logo.png b/sites/www/content/news/images/featured/flutter_logo.png new file mode 100644 index 00000000000..cfc0ee42f37 Binary files /dev/null and b/sites/www/content/news/images/featured/flutter_logo.png differ diff --git a/sites/www/content/news/images/featured/gemini-android-studio-flutter.png b/sites/www/content/news/images/featured/gemini-android-studio-flutter.png new file mode 100644 index 00000000000..2df5a5bedb1 Binary files /dev/null and b/sites/www/content/news/images/featured/gemini-android-studio-flutter.png differ diff --git a/sites/www/content/news/images/featured/whats-new-flutter-3-32.webp b/sites/www/content/news/images/featured/whats-new-flutter-3-32.webp new file mode 100644 index 00000000000..185d9243b0f Binary files /dev/null and b/sites/www/content/news/images/featured/whats-new-flutter-3-32.webp differ diff --git a/sites/www/content/news/images/featured/whats-new-flutter-3-35.png b/sites/www/content/news/images/featured/whats-new-flutter-3-35.png new file mode 100644 index 00000000000..10f1e58018c Binary files /dev/null and b/sites/www/content/news/images/featured/whats-new-flutter-3-35.png differ diff --git a/sites/www/content/news/images/featured/whats-new-flutter-3-41-dart-3-11.png b/sites/www/content/news/images/featured/whats-new-flutter-3-41-dart-3-11.png new file mode 100644 index 00000000000..4c1f0d14ce0 Binary files /dev/null and b/sites/www/content/news/images/featured/whats-new-flutter-3-41-dart-3-11.png differ diff --git a/sites/www/content/news/images/flutter-news-toolkit-section.png b/sites/www/content/news/images/flutter-news-toolkit-section.png new file mode 100644 index 00000000000..4264f99f2a0 Binary files /dev/null and b/sites/www/content/news/images/flutter-news-toolkit-section.png differ diff --git a/sites/www/content/news/images/news-build-google-insight.svg b/sites/www/content/news/images/news-build-google-insight.svg new file mode 100644 index 00000000000..3823678484f --- /dev/null +++ b/sites/www/content/news/images/news-build-google-insight.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sites/www/content/news/images/news-grow-diversify.svg b/sites/www/content/news/images/news-grow-diversify.svg new file mode 100644 index 00000000000..36b768ab2a0 --- /dev/null +++ b/sites/www/content/news/images/news-grow-diversify.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sites/www/content/news/images/news-hero.png b/sites/www/content/news/images/news-hero.png new file mode 100644 index 00000000000..cd635a3ab0c Binary files /dev/null and b/sites/www/content/news/images/news-hero.png differ diff --git a/sites/www/content/news/images/news-save-time-effort.svg b/sites/www/content/news/images/news-save-time-effort.svg new file mode 100644 index 00000000000..66a9157b78a --- /dev/null +++ b/sites/www/content/news/images/news-save-time-effort.svg @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sites/www/content/news/index.md b/sites/www/content/news/index.md new file mode 100644 index 00000000000..665283ced25 --- /dev/null +++ b/sites/www/content/news/index.md @@ -0,0 +1,10 @@ +--- +title: News Toolkit +bodyTags: interior news +description: >- + Learn about the Flutter News Toolkit application template that + can news publishers build mobile applications easily and quickly. +publishDate: "2023-01-25" +--- + + diff --git a/sites/www/content/showcase/_README.md b/sites/www/content/showcase/_README.md new file mode 100644 index 00000000000..4759c435b8a --- /dev/null +++ b/sites/www/content/showcase/_README.md @@ -0,0 +1,8 @@ +# Flutter showcases and case studies + +This directory contains case studies and showcases of +Flutter apps and Flutter use by companies. + +If you'd like to add a case study or showcase, +please open an issue with more information about +your app, your company, and your use of Flutter. diff --git a/sites/www/content/showcase/_draft/aira.md b/sites/www/content/showcase/_draft/aira.md new file mode 100644 index 00000000000..a711c3a4cdd --- /dev/null +++ b/sites/www/content/showcase/_draft/aira.md @@ -0,0 +1,51 @@ +--- +title: Aira +description: Aira is a visual interpreting assistive technology service that connects users who are blind or have low vision with a live, professionally trained visual interpreter by video call for secure, objective, on-demand visual information, enhancing the user’s independence at work, school, and home. +logo: images/third_party/case_studies/aira/logo.webp +headline: Aira +summary: Aira builds for accessibility with Flutter +appName: Aira +companyName: Aira +card: images/third_party/case_studies/aira/logo.webp +locations: [] +platforms: [] +industries: [] +successMetrics: + - perc: 90 + desc: reduction in codebase size +tags: + - mobile + - android + - ios +publishDate: 2023-04-21 +--- + +**Goal** + +In 2020, Aira was looking for a way to streamline their app development while adding support for additional platforms. As demand for Aira’s visual interpreting solutions on desktop computers grew, adding a web-first, computer-first solution had become imperative. However, the cost to maintain and grow two separate codebases for their existing mobile apps had already become an issue, so adding a third codebase was out of the question. + +The team needed a new solution. As an assistive technology company, accessible design was Aira’s top priority. So in addition to looking for a multi-platform framework that would enable them to build quickly with minimal maintenance needs, their solution needed to meet a very high standard of accessibility. + +That’s when Aira’s development team discovered Flutter. With the support of Google, whose robust framework and investment in accessibility aligned with Aira’s goals, the team decided to rebuild their customer-facing app from scratch — and launch a third platform from the same codebase. + +**Why Flutter?** + +Aira chose Flutter both because it promised a single codebase for multiple platforms and because of Google’s overall accessibility commitment and inclusive design approach. It was important to Aira to choose a framework with accessibility built in, and Flutter fit the bill. + + + +**Their solution** + +Aira built a proof of concept with some basic accessibility controls, then tested it internally with blind individuals. The results were very promising, so Aira’s team reached out to the accessibility team at Flutter. This partnership was critical, according to Aira. Accessible design is complex, and establishing this relationship helped both teams learn from each other and iterate towards more accessible solutions. + +*Accessibility of our app on every platform is our top priority, Flutter’s built-in accessibility has given us a huge head start toward achieving that.* + +*-Vinu Somayaji, CTO, Aira Tech Corp* + +**Results** + +Aira retired their two native apps and launched Android and iOS mobile apps, a desktop app, and an SDK with Flutter. Because Flutter allowed them to develop all these apps from a single codebase, Aira’s overall codebase decreased in size by over 90%. + +This efficiency also allowed their small team to build with native accessibility, something they had not previously had the resources to do. It also dramatically increased their development speed. Before migrating to Flutter, Aira app releases were infrequent and not synchronized across platforms. Now, the team can release an update every two weeks. Flutter allows them to make rapid changes in response to real-time feedback, even with fewer engineers. + +Next, the team is considering future Flutter-based projects, including an internal dashboard and a multiplatform portal for enterprise customers. diff --git a/sites/www/content/showcase/_draft/supernova.md b/sites/www/content/showcase/_draft/supernova.md new file mode 100644 index 00000000000..b2873d24029 --- /dev/null +++ b/sites/www/content/showcase/_draft/supernova.md @@ -0,0 +1,50 @@ +--- +title: Supernova +description: Supernova, a design system platform, used Flutter to build their collaborative web app for designers and developers. +logo: images/third_party/case_studies/supernova/logo.jpeg +headline: Supernova +summary: Supernova, a design system platform, used Flutter to build their collaborative web app for designers and developers. +companyName: Supernova +card: images/third_party/case_studies/supernova/case_study_card.png +locations: + - North America +platforms: + - Web +industries: + - Productivity +tags: + - web +publishDate: 2021-11-05 +--- + +**Goal** + +In 2019, Flutter announced an [early adopter program](https://blog.flutter.dev/flutter-for-web-early-adopter-program-now-open-9f1fb146e4c4) for companies that were ready to build with Flutter’s web support. One of those early adopters, [Supernova](https://www.supernova.io/), was interested in using Flutter to build a collaborative design system platform for the web. + +In most organizations, the design and development teams work independently because they rely on different sets of tools. Supernova’s goal was to solve that disconnect by creating a platform where designers and developers can work together as one team. They also wanted to automate the process of turning the design system that designers use into something developers can directly consume in the form of code. + +**Why Flutter?** + +Originally, Supernova was written as a native macOS app, but their users showed a lot of interest in a web-based solution. Flutter appealed to the team because it would allow them to launch their tool on other platforms with a single codebase — especially because they knew they would eventually want a desktop app as well, since the tool is very compute-heavy and has more demanding performance needs than most websites. + +The tool also uses a lot of uncommon visual operations, and they liked that Flutter gave them a way to access the lower-layer rendering engine so they can build it their own way, instead of building it from scratch using WebGL. + +**Their Solution** + +The team found that using web-specific libraries with Dart saved them a huge amount of time. The few times they needed a plugin that lacked web support, such as with their code preview widget, they embedded it as HTML and used a JavaScript library for syntax highlighting. + +The entire tool is built with Flutter and Dart. Because it relies on a lot of sophisticated logic, their application is especially Dart-heavy, with Flutter used for the visualization layer. The team liked Dart’s language features like sound null safety, which they found crucial for making complex apps stable and maintainable. They were also excited about the annotation processing and code generation capabilities of Dart. + +They used Flutter’s CanvasKit renderer to parse and render the components from a data model in Figma. The team much preferred using the CanvasKit renderer through Flutter instead of writing shaders from scratch using WebGL. CanvasKit gave them more higher-level tools for rendering, letting them focus on the nuances of converting Figma’s non-standard vector models to work with their rendering engine. + +Because font management is a major challenge for developers, Supernova can support any font a designer wants to use. To do this, they used Flutter and the [google_fonts package](https://pub.dev/packages/google_fonts), which automatically downloads fonts directly from Google. + +Finally, Flutter allowed the team to share one codebase between the Supernova platform and a separate plugin that they built to run in Figma. Although there are completely different front-ends, they share the same data model and logic. + +***“We feel confident in our decision to use Flutter on the web.”*** + +\- Jiří Třečák, CEO, or Artem Ufimtcev, CTO, Supernova + +**Results** + +Two years after joining the early access program, Supernova launched their innovative design system platform with Flutter. Anyone can now bring their Figma designs into Supernova and immediately start exporting code for Flutter (or any other framework). Supernova’s documentation editor lets you create documents based on your design system, and includes an automation engine that updates your documents and code automatically when design changes are made. diff --git a/sites/www/content/showcase/abbey-road-studios.md b/sites/www/content/showcase/abbey-road-studios.md new file mode 100644 index 00000000000..0a931c177f3 --- /dev/null +++ b/sites/www/content/showcase/abbey-road-studios.md @@ -0,0 +1,27 @@ +--- +title: Abbey Road Studios +description: Learn how Abbey Road Studios is using Flutter to reinvent the songwriting process. +headline: Abbey Road Studios +summary: Reinventing the songwriting process with Flutter +companyName: Abbey Road Studios +logo: images/third_party/case_studies/abbey-road-studios/logo.png +card: images/third_party/case_studies/abbey-road-studios/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/_ACWeGGBP4E" +locations: + - Europe +platforms: + - Mobile +industries: + - Travel & Lifestyle + - Productivity +successMetrics: + - perc: 100 + desc: feature parity across Android and iOS +tags: + - mobile + - android + - ios +publishDate: 2021-10-21 +--- + +When Abbey Road Studios released the iOS version of the Topline app, they got one major request from users - an Android version. Watch the video to learn why the team turned to Flutter to deliver an experience-changing app to artists all over the world all on a time crunch. diff --git a/sites/www/content/showcase/agape.md b/sites/www/content/showcase/agape.md new file mode 100644 index 00000000000..541f444b38e --- /dev/null +++ b/sites/www/content/showcase/agape.md @@ -0,0 +1,20 @@ +--- +title: Agapé +description: Learn how Agapé Wellness uses Flutter to deliver a unified experience across all devices, helping people feel close even when apart. +headline: Agapé +summary: Forging deeper connections while unifying experiences and boosting efficiency with Flutter +appName: Agapé +companyName: Agapé +logo: images/third_party/case_studies/agape/logo.webp +card: images/third_party/case_studies/agape/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/H9njcR0fjO0" +locations: + - North America +platforms: + - Mobile +industries: + - Health +publishDate: 2025-05-21 +--- + +Discover how Agapé Wellness uses Flutter to deliver a consistently engaging user experience across all devices. Larry McKenzie, Engineering Lead at Agapé, explains how Flutter is woven into their mission to help people feel close, even when apart. Learn how Flutter improves efficiency, enables a single codebase, and makes their vision tangible. diff --git a/sites/www/content/showcase/alibaba-group.md b/sites/www/content/showcase/alibaba-group.md new file mode 100644 index 00000000000..6fd20df28ca --- /dev/null +++ b/sites/www/content/showcase/alibaba-group.md @@ -0,0 +1,22 @@ +--- +title: Alibaba Group +description: Learn how E-Commerce giant Alibaba is scaling China's largest second-hand marketplace and more with Flutter. +headline: Alibaba Group +summary: Alibaba scales China’s largest second-hand marketplace with Flutter +companyName: Alibaba Group +logo: images/third_party/case_studies/alibaba-group/logo.png +card: images/third_party/case_studies/alibaba-group/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/jtYk3gWRSw0" +locations: + - Asia +platforms: + - Mobile +industries: + - Travel & Lifestyle + - Productivity +tags: + - mobile +publishDate: 2021-10-29 +--- + +When the Xianyu team was challenged to improve their user experience by developing an app that was consistent across platforms, had beautiful graphics, and still loaded fast, they turned to Flutter. Watch the video above to learn why they continue to grow with Flutter. diff --git a/sites/www/content/showcase/anymind.md b/sites/www/content/showcase/anymind.md new file mode 100644 index 00000000000..8d0c77ff7fb --- /dev/null +++ b/sites/www/content/showcase/anymind.md @@ -0,0 +1,56 @@ +--- +title: AnyMind +description: AnyMind Group is an end-to-end commerce enablement company that provides enterprises, publishers, and creators with proprietary tools to grow, including app development and monetization for publishers. +headline: AnyMind +summary: AnyMind increases developer efficiency with Flutter News Toolkit +appName: AnyMind +companyName: AnyMind +logo: images/third_party/case_studies/anymind/logo.png +card: images/third_party/case_studies/anymind/case_study_card.png +poster: images/third_party/case_studies/anymind/case_study_poster.png +locations: + - Asia +platforms: + - Mobile +industries: + - Productivity +tags: + - android + - ios + - news +publishDate: 2023-03-21 +--- + +**Goal** + +AnyMind helps more than 1,300 publishers globally to acquire new users, improve user engagement, and maximize advertising revenue. Recently, several of their clients in the News industry asked AnyMind to help them develop mobile applications, but the team required more dedicated engineering resources in order to provide a scalable offering to their clients. + +To help their customers grow their businesses, AnyMind needed a way to quickly develop mobile apps for iOS and Android that are a pleasure to use, easy to monetize, and required the lowest possible maintenance costs. + +**Why Flutter?** + +The team looked into React Native and native frameworks, but when they learned about the [Flutter News Toolkit](https://blog.flutter.dev/introducing-the-flutter-news-toolkit-now-accepting-applications-9e926db55f6d), they knew they had found their solution. This free toolkit gives developers an easy-to-use template on which any news organization can build an app. It also includes blocks of sample code for common user interface and app functionalities, reducing the average app development time by up to 80%. + +Khaosod is one of the leading news websites in Thailand, and AnyMind has been helping Khaosod's Matichon Public Co.,Ltd., grow its Khaosod web properties for several years. AnyMind believes that there is a need for a mobile app offering to help publishers better satisfy their readers and users in the future. Khasod developed and released its own native Android and iOS app several years ago. However, due to a lack of operational and tech resources to grow the app, updates stopped after release. Khaosod and AnyMind team decided to implement the Flutter News Toolkit because it allows the company to develop apps that provide a good user experience and can be updated quickly. + +AnyMind built a proof of concept in Flutter and created one demo project. To meet their clients’ requirements, it was important that the app be able to display articles by category, that they could implement ads, and of course, that it offered a good user experience. Not only did Flutter meet the team’s criteria, they were also impressed by its wide selection of widgets, multiplatform publishing ability, and Google support. As the team already used Google AdMob and Firebase, AnyMind was confident in the ecosystem and decided to move forward. + + + +**Their solution** + +By utilizing the Flutter News Toolkit, AnyMind was able to quickly develop a feature-rich app with a great user experience and a large number of features within 2 weeks. Flutter News Toolkit not only supports monetization features such as Ads and subscriptions right out of the box, it also includes templates for onboarding, account creation and login, content feeds and pages, Google Analytics, notifications, social sharing, and more. The team also leaned on the [package repository](https://pub.dev/) for Dart and Flutter apps for even greater efficiency. + +**Quote** + +*“Flutter News Toolkit is essentially a business accelerator, because it allows publishers to focus even more on improving the user experience, which is what they should be focusing on. ”* + +\- Hiko(Takahiko Iwabuchi), Regional Head of Publisher Growth, AnyMind Group + +**Results** + +Flutter News Toolkit allowed AnyMind to reduce development time and maintenance costs, while releasing apps with a better user experience. It allowed them to focus on improving the user experience and allow their clients in the News industry to communicate more interactively with their users. + +After releasing their app for iOS and Android, AnyMind saw developer efficiency increase by 30-40%, with fewer engineers required support the same development velocity. They also saw a 120-150% increase in feature release compared to before the switch to Flutter. + +AnyMind plans to continue using Flutter News Toolkit in the future, and hopes to develop and implement their own article recommendation widget and subscription system. AnyMind plans to use this Flutter News Toolkit and further develop extensions to create more apps for more clients. We believe this model will contribute to the continued growth of our publishers. diff --git a/sites/www/content/showcase/atlas.md b/sites/www/content/showcase/atlas.md new file mode 100644 index 00000000000..85d4da97624 --- /dev/null +++ b/sites/www/content/showcase/atlas.md @@ -0,0 +1,48 @@ +--- +title: Atlas Associates +description: Japan-based startup Atlas Associates used Flutter and Firebase to build Arc, an AI-powered messaging app with ephemeral conversations. +headline: Atlas Associates +summary: How Atlas Associates built a next-gen AI messenger with Flutter and Firebase +appName: Arc +companyName: Atlas Associates +logo: images/third_party/case_studies/atlas/logo.png +card: images/third_party/case_studies/atlas/case_study_card.png +poster: images/third_party/case_studies/atlas/case_study_poster.png +locations: + - Asia +platforms: + - Mobile +industries: + - Social +publishDate: 2025-11-25 +--- + +**Goal** + +[**Arc**](https://www.atlasassociates.io/arc) is an AI-powered messaging app by the Japan-based tech startup [Atlas Associates](https://www.atlasassociates.io/), who began with a vision to redefine communication in the digital age. The team wanted to create a space for truly private, ephemeral, and intimate conversations, so Arc is designed so that every message, even group chats, disappear over time. + +This vision requires an architecture that can compete on a global level, based on four pillars: stability, speed, lightweight design, and high security. Their goal wasn't just to build another messaging app; it was to create an entirely new conversational experience, complete with robust AI characters and uncompromising security. + +Screenshots of chat experience for Arc + +**Why Flutter?** + +Atlas Associates chose Flutter for two reasons. + +First, Flutter’s unique ability to deliver high-fidelity experiences across multiple platforms from a single codebase is a strategic advantage for a compact team, enabling remarkable development velocity. + +Second, the team believed that the lag in app responsiveness often attributed to cross-platform frameworks wasn’t necessarily a limitation of the framework chosen, but often solvable with the right architecture and implementation approach. They were confident they could achieve the high-performance, fluid user experience their vision demanded with Flutter, alongside other solutions from the broader Google ecosystem. + +**Their solution** + +Atlas Associates’ small team was able to ship Arc, a high-performance app, to both Android and iOS following a rigorous optimization process to achieve their performance goals. They used [Flutter DevTools](https://docs.flutter.dev/tools/devtools) to dive deep into frame rendering times, CPU usage, and memory allocation to eliminate sources of jank at the millisecond level. Their focus on minimizing widget rebuilds through meticulous state management resulted in a highly fluid user experience. + +To power the app, the team chose a hybrid backend of specialized services. For the core experience, they relied on [Firebase](https://firebase.google.com/). [Firestore](https://firebase.google.com/products/firestore) served as the primary database, providing real-time synchronization and robust offline capabilities for ephemeral messages. They used [Firebase Authentication](https://firebase.google.com/products/auth) for a secure identity layer and [App Check](https://firebase.google.com/products/app-check) to ensure all backend requests came from a legitimate instance of their app, creating a critical defense against abuse. + +They also used a combination of additional Google Cloud products, including [Cloud Run](https://cloud.google.com/run) for complex, stateful, or computationally intensive microservices, and [Vertex AI](https://cloud.google.com/vertex-ai) for a variety of AI tasks, including calling the Gemini API, RAG and Vertex AI Search. + +“ By combining the rapid development capabilities of Flutter and Firebase with the scalable power of Cloud Run and the intelligence of Vertex AI, we have built a platform designed for global competition. ” - Takayuki Miyano, Founder, Atlas Associates + +**Results** + +Using Flutter with the power of Firebase and Google Cloud, Atlas Associations achieved incredible development velocity—shipping 144 updates in 34 months with a compact team. This sets the team up to move quickly and continue to define the next generation of communication experiences. diff --git a/sites/www/content/showcase/beike.md b/sites/www/content/showcase/beike.md new file mode 100644 index 00000000000..52c36b67901 --- /dev/null +++ b/sites/www/content/showcase/beike.md @@ -0,0 +1,21 @@ +--- +title: Beike +description: Learn how Beike helps users solve housing problems with Flutter +headline: Beike +summary: Beike helps users solve housing problems with Flutter +companyName: Beike +logo: images/third_party/case_studies/beike/logo.png +card: images/third_party/case_studies/beike/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/bHg6TzuP9bc" +locations: + - Asia +platforms: + - Mobile +industries: + - Travel & Lifestyle +tags: + - mobile +publishDate: 2021-10-29 +--- + +Beike Zhaofang [NYSE: BEKE] is a leading tech driven housing service platform, and is helping 300 million families have a better experience when searching for second-hand housing, new housing, rental housing, as well as decoration, home furnishing, and other community services. Learn how Beike uses Flutter in their apps to deliver a smooth experience and fast development speed on multiple platforms, and how the team builds up their internal infrastructure with Flutter. diff --git a/sites/www/content/showcase/betterment.md b/sites/www/content/showcase/betterment.md new file mode 100644 index 00000000000..dab37d4980c --- /dev/null +++ b/sites/www/content/showcase/betterment.md @@ -0,0 +1,24 @@ +--- +title: Betterment +description: Learn how investment advisor Betterment transitioned their codebase to Flutter at scale, increasing development velocity. +headline: Betterment +summary: Scaling development at Betterment with Flutter +appName: Betterment +companyName: Betterment +logo: images/third_party/case_studies/betterment/logo.png +card: images/third_party/case_studies/betterment/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/1J3B-xaoXgw" +locations: + - North America +platforms: + - Mobile +industries: + - Banking & Finance +tags: + - mobile + - android + - ios +publishDate: 2023-05-04 +--- + +Learn how the team at Betterment transitioned their codebase to Flutter at scale, and increased their development velocity in the process. diff --git a/sites/www/content/showcase/bmw.md b/sites/www/content/showcase/bmw.md new file mode 100644 index 00000000000..1c6c734cacf --- /dev/null +++ b/sites/www/content/showcase/bmw.md @@ -0,0 +1,49 @@ +--- +title: BMW +description: BMW Group is one of the most storied and innovative automobile manufacturers ever. As BMW has always been a spearhead for premium individual mobility in the automobile industry, the company is choosing Flutter for its mobile app platform. +headline: BMW +summary: Scaling customer-centric product development at BMW Group with Flutter +companyName: BMW +logo: images/third_party/case_studies/bmw/logo.webp +card: images/third_party/case_studies/bmw/case_study_card.png +poster: images/third_party/case_studies/bmw/case_study_poster.png +locations: + - Europe +platforms: + - Mobile +industries: + - Travel & Lifestyle +tags: + - mobile + - android + - ios +publishDate: 2021-10-29 +--- + +**Goal** + +For many years, BMW’s mobile app team focused primarily on the iOS version of their vehicle companion app – the BMW & MINI Connected apps. However, in 2018, they realized that the feature and design discrepancies between their iOS and Android offerings had grown too large. They needed to find a way to ensure, that the apps offered the same functionality to all consumers, regardless of mobile OS, BMW and MINI brand, without significantly increasing costs, or slowing feature development velocity. Next to the complexity of bringing iOS and Android together, the BMW Group must manage even more complexity on the product side. Because of different regulations and local requirements, the BMW Group’s mobile apps exist in a wide range of different variants in more than 45 countries. + +In addressing the problem, the team had two goals. From a business perspective, they wanted to be able to regularly release their products across all brands, platforms, and regions simultaneously, with the same feature capabilities based on customer feedback and business objectives. And to do that, they wanted to create a platform that was developer-friendly, developer-scalable, and performant, providing safe experimentation and continuous deployment. + +**Why Flutter?** + +As it was out of question to double up the iOS development teams for Android, thereby doubling costs and effort, a cross platform solution was evaluated. A small task force evaluated several cross-platform frameworks, including Flutter. Initially, the team was concerned that Flutter was not yet mature enough for the scale at which BMW needed to operate, so they designed several proofs-of-concept with each of the other frameworks. However, all the other platforms fell apart when the team decided against web-based content for a better user experience. + + + +**Their Solution** + +In October 2019, a selected group of BMW engineers met in Munich to discuss how to move forward with Flutter. They soon came to realize that no longer being constrained by a specific platform would allow them to adopt a more flexible, domain-based organizational structure where one team might focus on connection status and communication abstraction, while a few teams worked on the core platform side of the app, and several more teams were free to focus on new and innovative features for the end user. Flutter got the green light, and the teams began to rewrite all the app variants for the different platforms, countries, and brands — but this time, with a single codebase. + +***“The new app platform is built on three pillars: user friendliness, safety and reliability. It provides a consistently designed set of functions spanning all brands based on feedback and our customers’ usage behavior.”*** + +***Dr. Nicolai Kraemer, Vice President Offboard Platform BMW Group*** + +**Results** + +Less than a year after getting started, the My BMW App was launched in July 2020 and has established itself in 47 countries on five continents as a universal interface providing the user a seamless experience between mobile phone, vehicle, and the digital world. The My BMW App provides both a direct interface between the driver and their vehicle, and a communication channel with BMW dealers and the BMW brand. + +The BMW Group mobile developers have established a platform, internally called “Mobile 2.0 Platform”, that allows for automated builds of every single brand, market and OS, automated test, and deployment to mobile world and backends. This means that each day several builds are triggered and with every app build 96 variants are automatically built, tested, and deployed. As of October 2021, more than 10,000 versions of every app variant have been built. The ability to build and design once allowed the team to move much more quickly. But the quick turnaround wasn’t all that excited the team about the move to Flutter. They no longer had to worry about managing multiple codebases, which effectively solved the problem of feature disparity. + +All BMW and MINI customers would now enjoy a single experience, regardless of the platform they used to access the app — which also improved user feedback, especially for the historically underserved Android app. All in all, the team was able to move faster, maintain consistency, and delight users by making the switch to Flutter. diff --git a/sites/www/content/showcase/bytedance.md b/sites/www/content/showcase/bytedance.md new file mode 100644 index 00000000000..15805abaa5e --- /dev/null +++ b/sites/www/content/showcase/bytedance.md @@ -0,0 +1,53 @@ +--- +title: ByteDance +description: ByteDance, the multinational company behind over 80 apps, used Flutter to speed up their development process and release new apps and features faster. +headline: ByteDance +summary: Increasing productivity by 33% at ByteDance with Flutter +companyName: ByteDance +logo: images/third_party/case_studies/bytedance/logo.png +card: images/third_party/case_studies/bytedance/case_study_card.png +poster: images/third_party/case_studies/bytedance/case_study_poster.png +videoEmbedUrl: "https://www.youtube.com/embed/8RmsstcNE1Y" +locations: + - Asia +platforms: + - Mobile + - Web + - Desktop + - Embedded +industries: + - Productivity + - Social +successMetrics: + - perc: 33 + desc: increase in productivity + - perc: 5 + desc: reduction in package size +tags: + - mobile + - android + - ios +publishDate: 2021-11-05 +--- + +**Goal** + +In 2019, the team at [ByteDance](https://www.bytedance.com/en/) found themselves needing to create a large number of apps that worked across multiple platforms. Their existing solution involved a lot of duplicated work, and the team was sure they could streamline their approach and save time with a more efficient toolkit. + +**Why Flutter?** + +With Flutter, ByteDance discovered that they only needed to develop each app once, instead of creating separate versions for Android, iOS, and web. And because Flutter has its own rendering engine, they could also achieve more consistent performance across platforms. Plus, Flutter allows the Android, iOS, and web versions of an app to automatically stay in sync, reducing the number of updates required. + + + +**Their Solution** + +ByteDance was able to [customize Flutter’s open source framework](https://blog.flutter.dev/google-i-o-spotlight-flutter-in-action-at-bytedance-c22f4b6dc9ef) to perfectly suit their needs — and contributed valuable optimizations to the Flutter team in the process. Their contributions improved Flutter for all users by creating app frameworks, containerizing, improving performance, supporting add-to-app, and more. + +For their first real-world test, ByteDance implemented Flutter with an education app, designed to help children learn to write Chinese characters with a stroke-tracking feature. Taking inspiration from some open source projects, they decided to use SVG paths to represent strokes. The feature, built with Flutter, now supports more than 9,000 Chinese characters, including most of the commonly used characters, and has been a success across a variety of platforms. + +***“ByteDance has always wanted to be part of things that could push the industry forward, and Flutter is likely to be one of those things.”*** + +**Results** + +Flutter is now the go-to framework for multi-platform app development at ByteDance. For flagship apps such as Xingfuli, Jike, DaliJiaZhang, Xiaohe, Volcano, and [Xigua Video](https://www-ixigua-com.translate.goog/?_x_tr_sl=zh-CN&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=nui,sc,in,elem&wid_try=1), Flutter has increased team productivity by about 33%. Today, there are more than 700 Flutter developers at ByteDance, more than 200 of whom are actively developing with Flutter. The team uses Flutter not only for their mobile apps, but also to optimize apps for web, desktop, and embedded platforms. diff --git a/sites/www/content/showcase/caribou-coffee.md b/sites/www/content/showcase/caribou-coffee.md new file mode 100644 index 00000000000..0497c91250d --- /dev/null +++ b/sites/www/content/showcase/caribou-coffee.md @@ -0,0 +1,49 @@ +--- +title: Caribou Coffee +description: Caribou Coffee brings people together. With over 700 company-owned, non-traditional (license), and franchise locations in 10 countries, Caribou coffeehouses and their award-winning Perks loyalty program use technology to empower guests to order coffee however they want. +headline: Caribou Coffee +summary: Caribou Coffee migrates their app to a single codebase with Flutter +appName: Caribou Coffee +companyName: Caribou Coffee +logo: images/third_party/case_studies/caribou-coffee/logo.webp +card: images/third_party/case_studies/caribou-coffee/case_study_card.png +poster: images/third_party/case_studies/caribou-coffee/case_study_poster.png +locations: + - North America +platforms: + - Mobile +industries: + - Travel & Lifestyle +tags: + - android + - ios +publishDate: 2022-10-27 +--- + +**Goal** + +After seven years, Caribou Coffee’s mobile app was in need of a major update. The first iteration was written in Titanium and suffered from a high crash rate, clunky mobile experience, and shrinking developer community. It was rewritten in 2018 in both Swift and Kotlin to provide a native experience, but maintaining feature parity was very time-consuming. And after three years, it was becoming increasingly difficult for Caribou’s agile development team to maintain the feature experience and functionality between iOS and Android platforms. + +To solve that problem, the team wanted a platform that was fun to use and easy to learn, had a growing developer community, offered popular SDKs for common SaaS providers, could integrate with platform-native functionality, and felt fast and natural to the end user. + +**Why Flutter?** + +The team did a comprehensive search for their new solution, reviewing Flutter alongside Quasar, Ionic, React Native, Xamarin, Kotlin Multiplatform, and NativeScript. They wanted something with plenty of real-world use cases, third-party support, a high-quality developer experience, and good documentation, among other criteria. + +After a month-long review process, which included building demo apps on each framework, Caribou chose Flutter for its multi platform capabilities, flexibility, and developer efficiency. The team also liked Flutter’s seamless integration with the other Google tools they already used, including the Firebase SDK and platform to track and measure their mobile app usage and Remote Config for mobile features. + +**Their solution** + +Caribou invited Objective C, Kotlin, and JavaScript developers to get involved in the "launch" of their journey to Flutter. Initially, they worried that adopting Dart would be a challenge for some of their developers, but everyone was able to understand it quite easily. The team was able to quickly get prototypes working, and their existing CI/CD pipelines adapted nicely to the Flutter build process. So over the next few months, the team rewrote the Caribou Coffee app in Flutter, using a single codebase for both the iOS and Android apps. + +***“Flutter's single codebase gave peace of mind to everyone involved and brought our mobile teams together.”*** + +***- Ben Alman, Lead Software Engineer, Caribou Coffee*** + +**Results** + +Migrating to Flutter allowed Caribou’s designers and developers to start working together. The team credits the Zeplin style guides for enabling more effective conversations and decisions between the teams. + +Thanks to Flutter’s single codebase, all of Caribou’s developers are now able to work on feature creation. Before the migration, 50% of the team was dedicated to maintaining feature parity. + +Based on their success, Caribou plans to continue using Flutter to enhance their app. Next, the team is excited to use Flutter to bring Material You into the app, add privacy-respecting location awareness to enhance the drive-thru experience, and make it easier for friends to customize their drinks separately but purchase together. diff --git a/sites/www/content/showcase/credit-agricole.md b/sites/www/content/showcase/credit-agricole.md new file mode 100644 index 00000000000..6d5e62e7bf5 --- /dev/null +++ b/sites/www/content/showcase/credit-agricole.md @@ -0,0 +1,54 @@ +--- +title: Crédit Agricole +description: CA24 Mobile is the mobile banking app for retail clients of Credit Agricole Bank Polska, the Polish branch of banking group Crédit Agricole. +headline: Crédit Agricole +summary: Crédit Agricole puts customers first with Flutter +appName: Crédit Agricole +companyName: Crédit Agricole +logo: images/third_party/case_studies/credit-agricole/logo.webp +card: images/third_party/case_studies/credit-agricole/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/l11j5B1a8qI" +locations: + - Europe +platforms: + - Mobile +industries: + - Banking & Finance +tags: + - android + - ios +publishDate: 2022-10-27 +--- + +**Goal** + +Crédit Agricole Bank Polska knows that customer behavior is changing. As customers visit their local branches less often, the bank’s digital channels needed to improve to meet their customers’ expectations. But in the fast-moving world of technology and mobile devices, Crédit Agricole’s app was no longer up to their own standards. To meet their customers’ needs, the bank needed a new mobile app, quickly, and were committed to building the best one in the market. + +Rather than revamping their existing native apps, they decided to create an entirely new app from scratch. With this blank slate, they had carte blanche to explore creative solutions to meet their business needs, allow flexible growth, integrate with other components, and boost Crédit Agricole to the top of the market. + +**Why Flutter?** + +The team needed a modern, reactive, and design-focused solution that would allow them to create apps for multiple platforms. The technology had to allow them to add new features quickly and be easy to maintain, as well as meet the bank’s challenging UX requirements for a seamless customer experience. + +While many of their peers were developing apps with React Native, the Crédit Agricole team was interested in trying something new. Their existing native apps had become increasingly expensive to maintain, features were beginning to diverge between platforms, and it was becoming challenging to bring new features to market quickly. + +So after developing a proof of concept with several agencies and platforms, the Crédit Agricole team chose[ LeanCode](https://leancode.co/case-studies/credit-agricole-bank-polska) - software studio from Warsaw specializing in mobile banking apps, and Flutter for its cross-platform functionality, efficiency, and focus on design and to build their next generation app with. + +body image 2_eBay copy.png + +**Their solution** + +For the next year, a team of 250 people, including nearly 30 Flutter developers, worked together on one of the biggest Flutter apps ever created. Because of the enormous scale, the project was divided into 12 business squads and 4 technical squads. Each developer was assigned to one or more squads. They also developed a new Flutter-based design system that allowed them to easily update components on the go in response to bugs or lack of consistency. + +For a deeper technical discussion of the team’s Flutter experience, check out this [e-book](https://leancode.co/Building_Mobile_Banking_Apps_with_Flutter.pdf) they created to document their experience. + +***“I think we chose the best technology for our case, and from a time perspective, I can say we’re happy about this decision. Flutter gives us a lot of possibilities for further app development and its functionalities.”*** + +\- Tomasz Czerwiński, Strategy and Architecture Department Director and Technical Tribe Owner at Credit Agricole Bank Polska – “CA24 Mobile” banking app, Crédit Agricole + +***“Flutter is enterprise ready, meeting the high standards of product development procedures and security requirements of the banking industry.”*** + +\- Łukasz Kosman, CEO @ LeanCode +**Results** + +After 12 months, Crédit Agricole launched the MVP of their new app with Flutter. The new app is easier and cheaper to maintain and allows the team to react quickly to changes. It has also made managing and delegating tasks between developers easier by removing the need to distinguish between Android and iOS functionality. The new Flutter-based design system has allowed them to create new animations that help their app stand out, including their new avatar. Finally, Flutter saved the team a lot of time, as they no longer had to work on separate solutions for Android, iOS, or Huawei platforms, and could deliver new features more quickly, outpacing the rest in the banking market. diff --git a/sites/www/content/showcase/crowdsource.md b/sites/www/content/showcase/crowdsource.md new file mode 100644 index 00000000000..29bd656c325 --- /dev/null +++ b/sites/www/content/showcase/crowdsource.md @@ -0,0 +1,51 @@ +--- +title: Crowdsource +description: Because Crowdsource relies on a diverse user base to train Google’s AI models, it needs to be available to the broadest possible audience. The team used Flutter to re-create their Android app in record time, increasing their coverage from 73% to 96%. +headline: CrowdSource +summary: Increasing developer speed at Crowdsource with Flutter +companyName: CrowdSource +logo: images/third_party/case_studies/crowdsource/logo.webp +card: images/third_party/case_studies/crowdsource/case_study_card.png +poster: images/third_party/case_studies/crowdsource/case_study_poster.png +locations: + - North America +platforms: + - Mobile + - Web +industries: + - Education +successMetrics: + - perc: 23 + desc: increase in TAM + - perc: 50 + desc: reduction in code size + - perc: 100 + desc: increase in development speed +tags: + - mobile + - android + - web +publishDate: 2021-11-05 +--- + +**Goal** + +[Crowdsource](https://play.google.com/store/apps/details?id=com.google.android.apps.village.boond) by Google is a fun, gamified way for millions of people to help train Google’s AI and machine learning models, helping products like [Google Translate](https://play.google.com/store/apps/details?id=com.google.android.apps.translate), [Maps](https://play.google.com/store/apps/details?id=com.google.android.apps.maps), and [Photos](https://play.google.com/store/apps/details?id=com.google.android.apps.photos) better serve users across regions and cultures. Crowdsource also offers open-source datasets for non-Google products to help improve machine learning around the world. + +Currently, over three million users from 190 countries contribute to Crowdsource, but because the tool relies on engagement from as broad a user base as possible, it was important that the app expand beyond Android and web to include iOS — without overextending the team. + +**Why Flutter?** + +Crowdsource had previously used Flutter to implement a challenging “Smart Camera” feature, which runs an on-device machine learning model on a live camera. Despite the complexity of the feature, the Flutter development was a success, which gave the team a lot of confidence in the tool. + + + +**Their Solution** + +After the resounding success with the “Smart Camera” feature, the team at Crowdsource decided to rebuild the entire Android app in Flutter. Having previously used Flutter, there were no major challenges, and the team was surprised how quickly they were able to develop and release the new app. + +**Results** + +The recreated Android app helped Crowdsource reach considerably more users — from 73% of potential users to a whopping 96%. Currently, more than 20 million users have used the Crowdsource app to contribute data to Google with the express purpose of improving Google's AI for their language, culture or interest. Users are so passionate about the cause that they've self-organized into local communities across 200 cities in the world. Last quarter, the Crowdsource app collected its billionth label since inception. + +With Flutter, the team found the process much more efficient, allowing them to cut their code size in half, reduce their technical debt, and double their development speed. Because of these improvements, Crowdsource is now in the process of rewriting the app with Flutter for Android and considering a rewrite for web. diff --git a/sites/www/content/showcase/cz-zorgverzekeringen.md b/sites/www/content/showcase/cz-zorgverzekeringen.md new file mode 100644 index 00000000000..4429ebdf00d --- /dev/null +++ b/sites/www/content/showcase/cz-zorgverzekeringen.md @@ -0,0 +1,48 @@ +--- +title: CZ Zorgverzekeringen +description: Dutch health insurer CZ chose Flutter to serve 3.8 million customers, improving their app store ratings and time to market. +headline: CZ Zorgverzekeringen +summary: Building reliable, secure digital health insurance access with Flutter +appName: CZ Zorgverzekeringen +companyName: CZ Zorgverzekeringen +logo: images/third_party/case_studies/cz-zorgverzekeringen/logo.webp +card: images/third_party/case_studies/cz-zorgverzekeringen/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/G3kXsy17Kl4" +locations: + - Europe +platforms: + - Mobile +industries: + - Health +tags: + - mobile + - android + - ios +publishDate: 2023-08-03 +--- + +**Goal** + +With 3.8 million customers across the Netherlands, CZ’s primary goal is to deliver a great user experience with impeccable data security. For their first app, the team used a low code solution to help them launch quickly. Soon, however, the team wanted to explore more UX possibilities, and it was time to look for another solution. To do so, CZ asked Sopra Steria, digital business partner, to join forces in the selection process and rebuilding of the app for its three labels. + +**Why Flutter?** + +The team made a list of their most critical requirements, starting with security. All of CZ’s development teams are DevSecOps teams, which means that security is always an important part of the development lifecycle. Next, they needed a solution that offered a great user experience, an active community, fast development speed and easy to learn. + +Based on this list, CZ ranked Flutter and several other popular mobile frameworks and then created some proofs of concept to verify their findings. Flutter emerged the clear winner for its multiplatform support, flexibility, and developer efficiency. + +**Their solution** + +The team discovered that Flutter would allow them to provide new functionality faster and keep it maintainable. When reflecting on the developer experience, Remi Appels, software architect, Sopra Steria said, ”Almost half of the development team didn’t have any experience in Dart or Flutter, and they learned fast! Developing in Flutter is fun, and creating smooth & fancy UI components is easy.” + +They also found that hot reload helped them to fine-tune UI details quickly, allowing them to deliver more features with less effort. + +*“With Flutter, we could build anything our designers could think of, with great security and performance, and still access native features of the platforms.”* + +\- Bas de Cort, lead mobile developer CZ + +**Results** + +Since relaunching their app with Flutter, CZ’s average Play store rating and Net Promoter Score have both improved. They have also reduced their time to market, allowing them to start releasing big new features every quarter, as well as continuing to improve existing ones. + +Based on their success, CZ is currently exploring the possibilities of using Firebase to extend their current toolset, including tools like Firebase Crashlytics, Remote Config, feature flags, remote messaging, AB testing, and push notifications. diff --git a/sites/www/content/showcase/data/companies.yaml b/sites/www/content/showcase/data/companies.yaml new file mode 100644 index 00000000000..4ac12ec0036 --- /dev/null +++ b/sites/www/content/showcase/data/companies.yaml @@ -0,0 +1,86 @@ +# This file contains the source data used to populate the +# "Companies using Flutter" card grid at the +# bottom of the https://flutter.dev/showcase page. +# +# Don't directly open PRs with additions to this list. +# +# If you'd like your company using Flutter to be listed, +# please open an issue proposing a case study or showcase. + +- name: Alibaba + logo: /images/third_party/logos/alibaba.svg + +- name: Baidu + logo: /images/third_party/logos/baidu.svg + +- name: Betterment + logo: /images/third_party/logos/betterment.svg + +- name: Bytedance + logo: /images/third_party/logos/bytedance.svg + +- name: CrowdSource + logo: /images/third_party/logos/crowdsource.svg + +- name: Dream11 + logo: /images/third_party/logos/dream11.svg + +- name: Ebay + logo: /images/third_party/logos/ebay.svg + +- name: GoogleAds + logo: /images/third_party/logos/googleads.svg + +- name: GooglePay + logo: /images/third_party/logos/googlepay.svg + +- name: Groupon + logo: /images/third_party/logos/groupon.svg + +- name: Hamilton + logo: /images/third_party/logos/hamilton.svg + +- name: iRobot + logo: /images/third_party/logos/irobot.svg + +- name: Kotak + logo: /images/third_party/logos/kotak.svg + +- name: Lotum + logo: /images/third_party/logos/lotum.svg + +- name: MGM + logo: /images/third_party/logos/mgm.svg + +- name: Nubank + logo: /images/third_party/logos/nubank.svg + +- name: NY Times + logo: /images/third_party/logos/nytimes.svg + +- name: Philips Hue + logo: /images/third_party/logos/philips-hue.png + +- name: Realtor.com + logo: /images/third_party/logos/realtor.svg + +- name: Square + logo: /images/third_party/logos/square.svg + +- name: Suamusica + logo: /images/third_party/logos/suamusica.svg + +- name: Surface + logo: /images/third_party/logos/surface.svg + +- name: Talabat + logo: /images/third_party/logos/talabat.png + +- name: Tencent + logo: /images/third_party/logos/tencent.svg + +- name: Toyota + logo: /images/third_party/logos/toyota.svg + +- name: Ubuntu + logo: /images/third_party/logos/ubuntu.svg diff --git a/sites/www/content/showcase/data/demos.yaml b/sites/www/content/showcase/data/demos.yaml new file mode 100644 index 00000000000..59d4a456df2 --- /dev/null +++ b/sites/www/content/showcase/data/demos.yaml @@ -0,0 +1,48 @@ +# This file contains the source data used to populate the +# carousel of Flutter demos on the https://flutter.dev/showcase page. +# +# Don't directly open PRs with additions to this list. +# Generally it is reserved for official Dart and Flutter demos. +# +# If you have a full demo you think should be included, +# please open an issue with more information. + +- title: I/O Flip + description: An AI designed card game showcasing PaLM, MakerSuite, Dreambooth, Flutter, Firebase, and Cloud. + image: images/demos/Flip_Hero_Graphic.png + url: https://flip.withgoogle.com/ + +- title: Holobooth + description: Flutter + MediaPipe and Tensorflow in an AI game experience on the web + image: images/demos/holobooth.png + url: https://holobooth.flutter.dev/ + +- title: I/O Pinball + description: A Flutter Web game showcasing the capabilities of Flame, the Flutter 2D Game Engine + image: images/demos/io_pinball.png + url: https://pinball.flutter.dev/ + +- title: I/O Photo Booth + description: Take a photo with this web app that showcased Flutter and Firebase for Google I/O 2021. + image: images/demos/io_photo_booth.jpg + url: https://photobooth.flutter.dev/ + +- title: Dashatar + description: A Flutter web app demo to create a Dashatar for Flutter Engage. + image: images/demos/dashatar.jpg + url: https://dashatar-dev.web.app/ + +- title: Flutter Flokk + description: A fresh and modern Google Contacts manager that integrates with GitHub and Twitter. + image: images/demos/flutter_flokk.jpg + url: https://flutter.gskinner.com/flokk + +- title: Flutter Folio + description: Try the scrapbooking app that runs on iOS, Android, Mac, Linux, Windows, and the web. + image: images/demos/flutter_folio.jpg + url: https://flutter.gskinner.com/folio + +- title: Flutter Vignette + description: Get inspiration with these innovative app designs made with Flutter. + image: images/demos/flutter_vignette.jpg + url: https://flutter.gskinner.com/vignettes diff --git a/sites/www/content/showcase/data/google_apps.yaml b/sites/www/content/showcase/data/google_apps.yaml new file mode 100644 index 00000000000..74a3385fe32 --- /dev/null +++ b/sites/www/content/showcase/data/google_apps.yaml @@ -0,0 +1,47 @@ +# This file contains the source data used to populate the +# "Flutter at Google" carousel on the https://flutter.dev/showcase page. +# +# Only apps built with Flutter by teams at Google should be added to this list. + +- title: NotebookLM + image: images/google_apps/image_1.png + url: /showcase/notebooklm + +- title: Google Pay + image: images/google_apps/google_pay_logo.webp + url: /showcase/google-pay + +- title: Google Earth + image: images/google_apps/google_earth_logo.webp + +- title: Google Ads + image: images/google_apps/google_ads_logo.webp + +- title: Google Classroom + image: images/google_apps/google_classroom_logo.webp + url: /showcase/google-classroom + +- title: YouTube Create + image: images/google_apps/youtube_create_logo.webp + +- title: Google Cloud + image: images/google_apps/google_cloud_logo.webp + +- title: Google One + image: images/google_apps/google_one_logo.webp + +- title: FamilyLink + image: images/google_apps/familylink_logo.webp + +- title: Crowdsource + image: images/google_apps/crowdsource_logo.webp + url: /showcase/crowdsource + +- title: Google Analytics + image: images/google_apps/google_analytics_logo.webp + +- title: Readalong + image: images/google_apps/readalong_logo.webp + +- title: Fitbit Ace + image: images/google_apps/fitbit_ace_logo.png diff --git a/sites/www/content/showcase/dow-jones.md b/sites/www/content/showcase/dow-jones.md new file mode 100644 index 00000000000..77f68336a6f --- /dev/null +++ b/sites/www/content/showcase/dow-jones.md @@ -0,0 +1,53 @@ +--- +title: Dow Jones +description: As the publisher of The Wall Street Journal, Barron’s, and MarketWatch, Dow Jones’ mission is to provide the world’s most trusted journalism , data, and analysis to help businesses and professionals make decisions for a better future. +headline: MarketWatch Stock Market Game +summary: MarketWatch launches Virtual Stock Exchange app in 3 months with Flutter +appName: MarketWatch Stock Market Game +companyName: Dow Jones +logo: images/third_party/case_studies/dow-jones/logo.webp +card: images/third_party/case_studies/dow-jones/case_study_card.png +poster: images/third_party/case_studies/dow-jones/case_study_poster.png +locations: + - North America +platforms: + - Mobile +industries: + - Banking & Finance +successMetrics: + - perc: 50 + desc: reduction in development costs +tags: + - mobile + - android + - ios +publishDate: 2023-01-25 +--- + +**Goal** + +In response to the recent growth in individual investing, MarketWatch saw a need for engaging and realistic investment training. They created a web-based investment game called the Virtual Stock Exchange where users build portfolios, react to markets in real time, and compete for a spot at the top of leaderboards. + +While the Virtual Stock Exchange game was widely successful, MarketWatch wanted to better engage the education and university market with a new mobile app. The project to build a mobile app kicked off three months prior to the start of the academic year in September, giving the developers a tight deadline to build a worthwhile experience. + +**Why Flutter?** + +They quickly realized developing native iOS and Android apps would require more time than they had, so MarketWatch brought in Flutter agency [Very Good Ventures](https://verygood.ventures/) (VGV) to build and launch the Virtual Stock Exchange app before the start of the new school year. + +VGV needed to deliver a user-friendly design and robust features by an ambitious deadline, and they leaned into Flutter’s core features to do just that. First, they showed the MarketWatch team a proof of concept built in Flutter, including rough UI and app flows. To save time, they leveraged Flutter’s pre-made widget libraries so that design and development could happen in parallel. As the design evolved, the ability to easily customize the widgets made refactors more streamlined, and Hot Reload allowed developers, designers, and testers to see modifications in the code without restarting the app. Because Flutter leverages one codebase for multiple platforms, the team could quickly update designs and refactor code knowing that changes would not impact iOS or Android individually. All together, these features allowed VGV and MarketWatch to start development much earlier than if design had been performed fully upfront. + + + +**Their solution** + +As the app was being developed, VGV leaned on Flutter’s Hot Reload feature to make rapid updates in response to feedback from the MarketWatch team. In just three months, the team was able to launch a feature-packed app, including stylish, interactive charts and graphs that allow users to quickly see how their virtual portfolio is performing, easy-to-follow quote information, and real-time, simulated trading including transaction details. The app also offers users insight to where they stack up against competing investors through an expansive leaderboard. It deep-links to informative news articles within the MarketWatch app, which allows users to do research on stocks that they are interested in to ensure they make well-informed investment decisions. Animations, which the team created directly in Flutter using CustomPaint, create beautiful and effective branding moments. + +*“Thanks to Flutter and VGV, we delivered on our goal of building a fun, engaging, and performant app for all screens and mobile devices in significantly less time and cost than if we built it natively. The team and thousands of players are very happy with the results.”* + +\- Clarence Kwei, SVP Consumer Technology, DOW JONES + +**Results** + +Just in time for the beginning of the fall college semester, MarketWatch and VGV launched the MarketWatch Stock Market game for Android and iOS after just three months of development. Despite the tight timeline, the app met MarketWatch’s goal of releasing a beautiful, feature-rich app with a captivating user experience. + +As a result of their new Flutter-based development process, MarketWatch has seen improved developer efficiency and a 50% reduction in development costs. Based on this success, the team is exploring building more Dow Jones apps with Flutter. diff --git a/sites/www/content/showcase/dream11.md b/sites/www/content/showcase/dream11.md new file mode 100644 index 00000000000..86f0d78653b --- /dev/null +++ b/sites/www/content/showcase/dream11.md @@ -0,0 +1,22 @@ +--- +title: Dream11 +description: When the 3-person team at Dream11 decided they needed a new multiplatform solution to more quickly deliver an innovative user experience, they decided to test Flutter. Watch the video to learn more about how it went. +headline: Dream11 +summary: Supporting 50 million fantasy sports users in India +companyName: Dream11 +logo: images/third_party/case_studies/dream11/logo.png +card: images/third_party/case_studies/dream11/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/lCeRZhoqEP8" +locations: + - Asia +platforms: + - Mobile +industries: + - Travel & Lifestyle +tags: + - mobile + - android +publishDate: 2021-11-05 +--- + +When the 3-person team at Dream11 decided they needed a new multiplatform solution to more quickly deliver an innovative user experience, they decided to test Flutter. Watch the video to learn more about how it went. diff --git a/sites/www/content/showcase/ebay.md b/sites/www/content/showcase/ebay.md new file mode 100644 index 00000000000..e82470e6266 --- /dev/null +++ b/sites/www/content/showcase/ebay.md @@ -0,0 +1,71 @@ +--- +title: eBay +description: In 2019, Flutter helped eBay Motors launch brand-new apps for iOS and Android in under a year — and won over their entire engineering team in the process. +headline: eBay +summary: Delighting engineers at eBay with Flutter +appName: eBay Motors +companyName: eBay +logo: images/third_party/case_studies/ebay/logo.webp +card: images/third_party/case_studies/ebay/case_study_card.png +poster: images/third_party/case_studies/ebay/case_study_poster.png +locations: + - North America +platforms: + - Mobile +industries: + - Travel & Lifestyle +successMetrics: + - perc: 98.3 + desc: shared code + - perc: 70 + desc: developers believe development is 2x faster than native solutions + - perc: 100 + desc: developers say they prefer over iOS or Android +tags: + - mobile + - android + - ios +publishDate: 2021-11-05 +--- + +**Goal** + +For years, auto enthusiasts have relied on [eBay](https://www.ebay.com/b/Auto-Parts-and-Vehicles/6000/bn_1865334) to buy and sell hard-to-find cars, but there was no app experience exclusively for them. So in 2018, the eBay Motors team was asked to develop a new app for both [Android](https://play.google.com/store/apps/details?id=com.ebay.motorsapp&hl=en_US&gl=US) and [iOS](https://apps.apple.com/us/app/ebay-motors-buy-sell-cars/id1456156090), with a full feature set and the same look and feel as the main eBay app — all in under a year. + +The team knew that with their limited size, building two separate native apps in that amount of time was impossible, so they searched for a cross-platform solution that could help them meet their deadline. + +**Why Flutter?** + +The team had heard a lot of buzz about Flutter, which had just released its first full version a few weeks earlier. Although eBay had been unimpressed by other cross-platform SDKs they had researched in the past, Flutter sounded like a promising alternative. Because the team needed to work fast and maintain a native feel, they were especially excited about Flutter’s time-saving and design capabilities, so they decided to give it a shot. + + + +**Their Solution** + +With their interest piqued, eBay spent a month trying to find gaps in Flutter’s capabilities. To their surprise and delight, Flutter was able to handle everything they could think to throw at it. + +Encouraged, the eBay Motors team scheduled a series of workshops to ramp-up the Engineering team into Flutter. No one had any prior experience, so they registered for the Flutter Bootcamp from [AppBrewery](https://www.appbrewery.co/p/flutter-development-bootcamp-with-dart) and hosted a series of hands-on workshops in-house. + +Right from the start, the team was excited about Flutter. Everyone found the development experience much more fun, and they discovered it was much faster to build with Flutter than with the native tools they’d used in the past. For example, in native Android and iOS development, it can take several minutes for developers to see their code reflected in the emulator. With Flutter, [it takes seconds](https://tech.ebayinc.com/product/under-the-hood-of-ebay-motors-new-app-powered-by-advanced-technology-like-flutter-ml-and-bff/). + +They were also very impressed with Flutter’s out-of-the-box testing support, which greatly [exceeded their expectations](https://tech.ebayinc.com/engineering/ebay-motors-screenshot-testing-with-flutter/). They even decided to insist on 100% code coverage going forward, which they enforced by automating their pull requests. + +And of course, the level of cross-platform code sharing was an enormous draw. Flutter allowed the team to share code for almost everything: the UI, business logic, domain models, analytics, network stack, and even the CI pipeline. There were also plenty of plugins to help them integrate the device APIs they’d need, and on the few occasions where the team needed to write their own, the work was done within hours. + +Ultimately, the biggest challenge was just figuring out how to unify their Android and iOS teams, which had always worked independently. But with careful planning, they were able to come together as a single team, giving them a stronger and more consistent voice within the company. + +***“Flutter has not only met our expectations — it has dramatically exceeded them.”*** + +\- Corey Sprague, Senior iOS Engineer, eBay + +**Results** + +By dramatically reducing their development time, the eBay Motors team met every deadline in their production schedule. They launched a beta version within three months of the initial request, and released a full production app just a few months later. + +Better still, the new eBay Motors app got great feedback from users — and it was a hit with the developers, too. In an internal survey, [100% of the developers](https://tech.ebayinc.com/product/ebay-motors-accelerating-with-fluttertm/) on the eBay Motors team said they enjoyed Flutter development more than iOS or Android, and 70% said they thought it was “at least twice as fast.” + +In fact, thanks to Flutter, eBay Motors now ships a new version of their app to both app stores every week, and has been able to add new features like live chat, escrow and community boards to both platforms at once. By bringing together their entire development team under one roof, they’ve also been able to save a whole lot of time. Now that their apps share 98.3% of their code, the eBay Motors app has a single source of truth — which means one set of meetings, one set of designs, one backlog queue, and one team to manage. + +The increased speed has also allowed them to replace paper prototypes with functioning prototypes for user testing, giving them much more reliable results. And because the test automation is so robust, the team converted both their QA engineers into software engineers. + +If you ask the engineering team at eBay Motors, they’ll say that Flutter has done more than just improve their workflow. It’s actually fundamentally changed the way the team operates, making them not just more productive, but happier and more excited about their work. diff --git a/sites/www/content/showcase/etermax.md b/sites/www/content/showcase/etermax.md new file mode 100644 index 00000000000..d6483406271 --- /dev/null +++ b/sites/www/content/showcase/etermax.md @@ -0,0 +1,51 @@ +--- +title: Etermax +description: Etermax is a global entertainment tech company, known for its popular multiplatform games including the Trivia Crack series. Since 2009, they’ve developed dozens of interactive, community-building titles across the Americas and Europe, and partnered with more than 20 brands to bring their ideas to life. +headline: Etermax +summary: Etermax boosts developer efficiency with Flutter +appName: Etermax +companyName: Etermax +logo: images/third_party/case_studies/etermax/logo.png +card: images/third_party/case_studies/etermax/case_study_card.png +poster: images/third_party/case_studies/etermax/case_study_poster.png +locations: + - South America +platforms: + - Mobile +industries: + - Games +tags: + - mobile + - android + - ios + - games +publishDate: 2024-05-14 +--- + +**Goal** + +With several popular multiplatform games already under their belts, the Etermax team was interested in a cross-platform solution to streamline their development process. The solution needed to integrate with the existing apps for their flagship game [Trivia Crack](https://play.google.com/store/apps/details?id=com.etermax.preguntados.lite&hl=en&gl=US) and allow them to implement features across iOS, Android, and web simultaneously. In doing so, they wanted to achieve a faster go-to-market, reduce development time, and help them resolve inconsistencies in their native codebases. + +**Why Flutter?** + +In November 2022, the Extermax team assessed several frameworks, including Flutter, by building a proof of concept within Trivia Crack and testing them in a live production environment. This included testing compatibility for ads, video players, and camera recording, and integrating various third-party SDKs such as Amplitude, Appsflyer, Bugsnag, and Firebase. They also investigated the feasibility of incorporating native views. After weeks of rigorous testing, the team chose Flutter and began the migration. + + + +**Their solution** + +Etermax launched the first Flutter version of Trivia Crack in just six weeks, including progressive rollout strategies for testing and implementation. They also integrated Firebase to send remote push notifications and for phone verification, which they found essential for enhancing user engagement and ensuring secure user authentication. Aside from Firebase, Etermax also leverages Google tools and services including Google Cloud, Workspace, and Ads to support their app development and operational needs. + +“*Hot Reload significantly speeds up our development process, allowing for quick iterations, efficient debugging, and seamless experimentation with UI changes.*” + +\- Pablo Iacopi, Android Staff Principal Engineer, Etermax + +**Results** + +The Etermax team found Flutter easy to learn, allowing their developers to start building quickly. The familiarity of the UI elements made the transition even smoother for their iOS developers, who were already accustomed to using SwiftUI. + +Flutter's single codebase expedited Etermax’s development process, leading to the quicker go-to-market strategy they were looking for. It also helped prevent inconsistencies between their Android and iOS versions, ensuring a smoother launch process. + +In particular, the team found the hot reload feature especially helpful due to its ability to instantly update the app's code and see changes in real time. Etermax credits this feature with significantly speeding up their development process, allowing for quick iterations, efficient debugging, and seamless experimentation with UI changes. + +Etermax is currently integrating Flutter into Trivia Crack's other native apps, and the team anticipates a substantial reduction in their codebase and app size. They also expect a higher rate of feature releases for Trivia Crack, with developer efficiency potentially doubling as new features are now only authored once. diff --git a/sites/www/content/showcase/expo-city-dubai.md b/sites/www/content/showcase/expo-city-dubai.md new file mode 100644 index 00000000000..2e510cf81af --- /dev/null +++ b/sites/www/content/showcase/expo-city-dubai.md @@ -0,0 +1,106 @@ +--- +title: Expo City Dubai +bodyTags: interior showcase showcase-story +description: Expo City Dubai is a mixed-use smart-city district where people can live, work, build businesses, and visit. Merixstudio partnered with Expo City Dubai to build a cross-platform Flutter app that helps people navigate the fast-growing destination. +logo: images/case_studies/expo-city-dubai/logo.png +headline: Expo City Dubai +summary: From visitor guide to smart-city super app, Expo City Dubai in Flutter +appName: Expo City Dubai +companyName: Expo City Dubai +card: images/case_studies/expo-city-dubai/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/Busrmb6Kh5c" +options_location: Asia +options_platform: Mobile +options_social: Travel & Lifestyle +successMetrics: [] +date: 2026-03-24 +feature_color: "#F0B800" +feature_theme: light +featured: false +featured_card_id: +publishDate: "2026-03-24" +tags: +- mobile +- Android +- ios +--- + +**Introduction** + +[Expo City Dubai](https://www.expocitydubai.com/) (ECD) is a mixed-use smart-city district where people can live, work, build businesses, and visit—with residences, offices and coworking, retail and dining, plus tourism, museums/cultural venues, exhibitions, and major events in one place. It continues to grow on the foundations created for Expo 2020 Dubai. + +The core challenge was to create a mobile “companion” that works for very different audiences—tourists and day visitors, but also tenants, founders, and employees—coming from multiple cultural backgrounds and using different languages (including right-to-left scripts). The product was built for an **international, diverse set of users**, with a simple entry path and **no mandatory login** for general use. + +Because Expo City Dubai covers a large area, the quality of the navigation and information architecture has real-world consequences. Unclear labels, missing context, or too many steps to reach directions can lead to wrong turns and longer routes on site. The UX therefore had to be designed for speed and clarity: find a place, understand where it is, and get there with minimal effort. + +Home screen of the Expo City Dubai app + +**Why Flutter?** + +Expo City needed one team to ship consistently on iOS and Android, while keeping quality high and maintenance predictable. A single codebase in Flutter made that feasible—without sacrificing the degree of UI customization required for a highly branded, map-heavy experience. + +**The rationale came down to a few decision-level factors:** + +* Cross-platform leverage: one product roadmap, one implementation stream, two platforms. +* Performance for interactive UI: the app’s heart is the map and the interactions around it; Flutter’s rendering model and control over UI details fit that requirement well. +* Developer experience and iteration speed: a fast feedback loop matters when backlog priorities change with events, seasons, and the city’s growth. +* When native was needed: in a few edge cases, the team used Flutter’s **add-to-app** model—adding native iOS/Android extensions where required, while keeping the cross-platform core. + +
+ +**Building with Flutter** + +[Merixstudio](https://www.merixstudio.com/development/flutter), Expo City tech partner, designed the product around a clear reality: for many people on site, “content” is secondary. The first question is: Where am I, where should I go next, and how do I get there? + +Flutter enabled a single, consistent **map-first experience** across iOS and Android—critical when the map is the primary UI and the product must stay visually and behaviorally consistent for a diverse, international user base. It also gave the team strong control over UI interactions around Mapbox (map-driven browsing, navigation entry points, saved places) while keeping delivery and maintenance centralized in one codebase. + +For maps, the team used the **official Mapbox Maps Flutter SDK**. Because it doesn’t include turn-by-turn navigation, they extended it via **platform channels**, bridging to the native Mapbox Navigation SDKs on iOS and Android. This kept the core experience and product logic in Dart, adding only thin native layers where necessary. + +From there, the app expanded into supporting flows that turn “a map” into “a visit”—the same “what’s inside” promise described publicly on the app listing: + +* Interactive map with point-to-point navigation, with bookmarking so users can pin places before arriving. +* A directory of attractions, events, dining options, and businesses—a content layer that stays useful even when you’re not yet on site. +* Visitor guide, including practical parking and accessibility information. +* Event awareness, including “today’s events” improvements shipped in early 2026. + +
+ +**Architecture and integrations** + +On the data side, a headless CMS (Contentful) supported consistent content updates, while integrations with Microsoft Dynamics helped fit the app into a broader digital ecosystem. + +To keep performance predictable during traffic spikes (for example during major exhibitions and events), the backend and infrastructure were set up for autoscaling on Amazon Web Services. + +Flutter also supported the project’s architecture and integrations by making it easier to keep “content services” wiring consistent across both platforms. The app consumed CMS-driven content and business data through API layers, with Flutter acting as the shared presentation and orchestration layer. Thanks to that, the Integration logic incl.data fetching, caching, error handling, and feature rollout rules didn’t have to be duplicated for iOS and Android. This reduced platform drift and made it simpler to evolve. + +The architecture relies on flutter_bloc for state management, get_it with injectable for dependency injection, Dio for networking, and go_router for routing. Storage is split between flutter_secure_storage for credentials and shared_preferences for lightweight state. Firebase powers analytics, crashlytics, remote config, and push notifications, while Tealium handles tag management. On the UI side, the team used cached_network_image, flutter_svg, video_player, and a Widgetbook-driven component library. + +The codebase is organized into internal packages—separating API, data, common utilities, widgets, and theming—keeping the dependency graph clean and enabling parallel development across the team. Where platform-specific SDKs were required—most notably Mapbox Navigation—the team used Flutter’s platform channels to bridge to native code, keeping the app fully within Flutter. + +**Inclusivity by design: language and accessibility** + +This is where mobile decisions become product decisions. The app was built to be culturally intuitive across multiple audiences and scalable across languages, including right-to-left layouts. It was also developed with accessibility in mind (aiming toward WCAG alignment and highlighting facilities available to people with disabilities). + +**Quality and trust (what's often invisible)** + +Trust is often "felt" rather than explicitly articulated. Here, it was tested. The codebase went through a security audit by the Expo City Dubai's security team, and the project also underwent a sustainability assessment by Ecovadis at the Expo City Dubai's request. + +Event calendar in the Expo City Dubai app + +**Key results & business impact** + +Below are the achieved outcomes: + +* Scalability validated at high traffic: load tests verified stability for up to 400,000 simultaneous users during spikes like major events. +* Integration foundation: delivered several key integrations, including Contentful & Microsoft Dynamics as part of the initial solution, enabling the app to plug into the wider city ecosystem. +* Client satisfaction: achieved a 10/10 NPS from users (with internal team satisfaction 4.5/5). +* Design recognition: earned second prize in the mobile category at the WaysConf Awards. +* Industry distinction: the app was listed among nominees in the “Travel & Transport” category of Mobile Trends Awards (awards announced in March 2025). + +And because the app’s growth is intertwined with the city’s growth, external recognition of Expo City matters too: in October 2025, Expo City Dubai was awarded the global “rising star” free zone of 2025 by fDi Intelligence. + +A screenshot of the Expo City Dubai app showing the interactive map + +**Conclusion** + +The key takeaway is that **Flutter works as an enterprise-grade foundation**—not just for cross-platform delivery, but for long-term product evolution. For Expo City Dubai, the app was designed as a **superapp platform**, bringing together multiple services and audiences in a fast-growing smart city. That architecture keeps the product flexible as the city expands—supporting everything from business and workplace needs to navigation, lifestyle, culture, and tourism. In other words, the app isn’t just describing the city; it’s becoming part of how the city runs. diff --git a/sites/www/content/showcase/google-classroom.md b/sites/www/content/showcase/google-classroom.md new file mode 100644 index 00000000000..b1b0645e1b5 --- /dev/null +++ b/sites/www/content/showcase/google-classroom.md @@ -0,0 +1,51 @@ +--- +title: Google Classroom +description: When the Google Classroom team saw the productivity increases the GPay team experienced after migrating to Flutter, they decided to make the switch. Watch the video to learn how it went. +headline: Google Classroom +summary: Increasing productivity with Flutter +appName: Google Classroom +companyName: Google +logo: images/third_party/case_studies/google-classroom/logo.webp +card: images/third_party/case_studies/google-classroom/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/JVJF_M9bgj4" +locations: + - North America +platforms: + - Mobile + - Web +industries: + - Education +successMetrics: + - perc: 98 + desc: shared mobile code + - perc: 66 + desc: reduced code size + - perc: 50 + desc: increased development velocity +tags: + - mobile + - android + - ios + - web +publishDate: 2023-01-25 +--- + +When the Google Classroom team saw the productivity increases the GPay team experienced after migrating to Flutter, they decided to make the switch. Watch the video to learn how it went. + +When the COVID pandemic abruptly shifted students everywhere to remote learning, the Google Classroom team found themselves operating on a different scale almost overnight. By September 2021, Classroom was supporting millions of new monthly active users, and needed to quickly scale the team to meet the needs of these users across each platform quickly. With their mobile teams being stretched thin, Google Classroom decided to explore solutions that would reduce the burden on their developers. + +**Why Flutter?** + +The Google Classroom team knew that Flutter offered many of the features they wanted, including a single codebase supporting multiple platforms. They evaluated Flutter against several benchmarks, including its effects on latency, jank, memory, binary size, accessibility, and ease of hiring, and were pleased to see that the benefits of Flutter adoption outweigh potential regressions. The team expected regressions in a few areas like early instability, almost inherent to launching any brand new app, and binary size, but believed that Flutter’s single codebase would allow them to improve those in the long term. Based on this success, the team got the green light to migrate their existing Google Classroom apps to Flutter. + +**Their solution** + +The team split their effort into two launches, one for iOS and the other for Android. After building a completely new iOS app in Flutter, Google Classroom followed up with the Android release in six months. + +Most of the team had never used Flutter before, but the majority of Google Classroom’s engineers reported that Flutter development was easier than native development. In particular, they considered hot reload a “game changer” for productivity. It enabled them to refresh the app without reopening it, eliminating unnecessary context switching, saving time and reducing the developers’ mental load. + +**Results** + +Migrating to Flutter provided Google Classroom with a wealth of benefits. It accelerated their incremental build time from several minutes to a few seconds, which they estimate saves them a full week of developer time every month. The single codebase improved development time across platforms by “at least 50%,” they reported, and simplified their launches. + +There were other benefits as well. Flutter reduced Google Classroom’s codebase size by 54%, making it easier to maintain. App performance also improved, including a 62% reduction in median startup latency and a 63% reduction in tracked CUJ latency. diff --git a/sites/www/content/showcase/google-pay.md b/sites/www/content/showcase/google-pay.md new file mode 100644 index 00000000000..ba00bad706f --- /dev/null +++ b/sites/www/content/showcase/google-pay.md @@ -0,0 +1,71 @@ +--- +title: Google Pay +description: As Google Pay expanded to new regions — each with its own unique user dynamics, geography, and challenges — the team needed a more efficient way to make platform changes at scale. +headline: Google Pay +summary: Going global at Google Pay with Flutter +companyName: Google Pay +logo: images/third_party/case_studies/google-pay/logo.png +card: images/third_party/case_studies/google-pay/case_study_card.png +poster: images/third_party/case_studies/google-pay/case_study_poster.png +locations: + - North America +platforms: + - Mobile +industries: + - Banking & Finance + - Google +successMetrics: + - perc: 70 + desc: reduction in engineering effort + - perc: 35 + desc: reduction in lines of code +tags: + - mobile + - android + - ios +publishDate: 2021-11-04 +--- + +**Goal** + +With 100 million users in dozens of countries, [Google Pay](https://pay.google.com/) allows users around the world to pay, save, manage expenses, and more. But to do that, they relied on 1.7 million lines of code between their [Android](https://play.google.com/store/apps/details?id=com.google.android.apps.walletnfcrel) and [iOS](https://apps.apple.com/us/app/google-pay-save-pay-manage/id1193357041) apps — an amount that didn’t feel sustainable as Google Pay continued to expand to new countries, each of which would require its own unique features. + +To make things even more challenging, many of those new regions had a large number of iOS users, while their existing users were almost exclusively Android. That meant they would not only need to hire more iOS engineers, they would need to continue building every feature twice — once for Android, and once for iOS. + +So instead, they opted to invest in a cross-platform framework that would enable them to do more with less: Flutter. + +**Why Flutter?** + +The team initially tested Flutter as an [Add-to-app](https://flutter.dev/docs/development/add-to-app) possibility, but the opportunity to rewrite the whole app was too big to ignore. + +While it meant a heavy upfront investment of engineering resources, it would allow the team to unify their engineering leadership, shift their work away from endlessly patching holes, and increase the speed and efficiency of their client development for faster response and implementation times. + +Above all, migrating to Flutter would enable fast, resource-efficient scaling of Google Pay around the world. Whereas building out features on both Android and iOS required double the effort, Flutter would only require about 1.2 times as much work. So they decided to take the plunge. + + + +**Their Solution** + +Rebuilding Google Pay on Flutter didn’t come without its challenges. First, they would need to retrain the team on a new language, platform, and approach to the user interface. Then, they would need to rewrite the app as it was changing, because it was constantly being updated. And finally, they would need to jump through all of the necessary security reviews and audits for a second time where the app was already launched. + +But before any of that, they had to prove the concept. So in 2019, they spent several months building the case for migrating Google Pay to Flutter. A small team of three senior software engineers from Android and iOS came together, writing and rewriting until they had a vertical slice of the app — home page, chat, and payments (with critical native plugins). + +Then they ran a few small sprints for other engineers to give them an opportunity to provide feedback. Flutter was a hit — the team loved that they could get instant feedback while developing, as well as the number of high-quality widgets they could leverage to make development easier. + +Once they had the green light from senior management, they brought in 50 engineers and gave them six months to retrain and rewrite the app for a beta launch in Singapore. + +The launch was a success. Encouraged, they brought in another 100 engineers to help them relaunch Google Pay in India and the US on the Flutter codebase, as well. It was a race against time: They needed to rewrite an existing app with nearly 300 features and beta test it, then launch to over 100 million monthly active users, all while maintaining the legacy app. + +***“Everyone loved Flutter — you could see the thrill on people’s faces as they talked about how fast it was to build a user interface.”*** + +\- David Ko, Engineering Director, Google Pay + +**Results** + +Despite these challenges, the team launched Google Pay for beta testing in India in early August. + +The rebuilt Google Pay app is smaller, more efficient to manage, and easier to update. Despite adding several new features, the new codebase is 35% smaller than the original implementations — 1.1 million lines of code instead of 1.7 million. At the same time, the team estimates that they’ve saved about 60-70% of their engineers’ time because Flutter is just so much easier to manage. + +The team — now at nearly 180 software engineers — is still gathering feedback on the India beta test, but the results are looking promising. The India beta will roll out to all of the over 100 million Indian users later this year, bringing with it a fresh user interface and all of the features their users have come to know and love. + +With Flutter, Google Pay 3.0 will be able to scale quickly and efficiently across iOS and Android, starting with a major relaunch of Google Pay in the US this year. This technology provides a foundation for the team to build on as they expand Google Pay 3.0 to the rest of the world in 2021. diff --git a/sites/www/content/showcase/grupo-soma.md b/sites/www/content/showcase/grupo-soma.md new file mode 100644 index 00000000000..f5f81a2eb26 --- /dev/null +++ b/sites/www/content/showcase/grupo-soma.md @@ -0,0 +1,64 @@ +--- +title: Grupo Soma +description: Grupo Soma is a leader in the Brazilian fashion industry, with a portfolio of premium brands including Farm, Animale, Fábula, A.Brand, Foxton, and Cris Barros. +headline: Grupo Soma +summary: Grupo Soma increases in-app purchases by 12% with Flutter +appName: Farm +companyName: Grupo Soma +logo: images/third_party/case_studies/grupo-soma/logo.png +card: images/third_party/case_studies/grupo-soma/case_study_card.png +poster: images/third_party/case_studies/grupo-soma/case_study_poster.png +locations: + - South America +platforms: + - Mobile +industries: + - Travel & Lifestyle +successMetrics: + - perc: 12 + desc: increase in IAP + - perc: 11 + desc: increase in app sales +tags: + - mobile + - android + - ios + - monetization +publishDate: 2023-11-15 +--- + +**Goal** + +One of Grupo Soma’s flagship brands, [Farm](https://play.google.com/store/apps/details?id=br.com.farmrio.app&hl=en&gl=US), recently needed a digital refresh. After 25 years, Farm’s audience and identity had evolved, and its app no longer aligned with the current state of the brand. + +Grupo Soma’s in-house technology team, Soma Labs, was asked to refresh the Farm app, which had been built with another cross-platform solution. However, the team found that their current solution couldn’t support the updated needs of the app, which included new functionalities and micro-interactions, as well as a new design system. They were also eager to improve the app’s performance on both Android and iOS, so they decided to explore other frameworks. + +**Why Flutter?** + +Soma Labs heard about Flutter and were interested in its multiplatform support, flexibility, and developer efficiency. They built a proof of concept to see if Flutter could deliver the features they needed, and were pleased to find that it was easy to learn and implement. Flutter’s pre-formatted interactions and animations also worked seamlessly with Grupo Soma’s new design system, so they decided to build the new app with Flutter. + +*"Flutter was a great choice for developing our mobile commerce platform. We were impressed with the fast development, high level of customization, and performance of the widgets.”* + +\- Diogo Maximo, Engineering Manager, Grupo Soma + + + +**Their solution** + +The team used Flutter’s built-in interactions and animations to implement their design system, leaning on the documentation on flutter.dev to get up to speed quickly. They built the Farm app for Android and iOS simultaneously, saving weeks of development time. + +During the development process, the team realized that they could easily build a whitelabel app that could be scaled to the other brands within Grupo Soma. Because the apps use [Cloud Run](https://cloud.google.com/run) in a serverless infrastructure, Soma Labs could easily scale to other brands and only pay for what they consume. + +*“With its scalability and development speed, Flutter has proved to be the ideal tool for the modernization of Grupo Soma's applications.”* + +\- Danilo Silva, Head of IT, Grupo Soma + +**Results** + +Soma Labs built and launched the Farm app, as well as a scalable whitelabel app for its other brands, in just 45 days. In addition to the huge increase in developer efficiency that Flutter delivered, it also dramatically reduced operational costs with the creation of the whitelabel app. + +The app itself also delivered strong business results. Using Firebase, Soma Labs analyzed the Farm app’s performance 90 days after launch and found a 19% increase in downloads, as well as a 17% increase in active installations. The frequency of in-app purchases grew by 12%, which grew the app’s sales share from 7% to 18%. + +Soma Labs also observed “exponentially optimized performance” in the loading of the Android app, solving an app loading failure in the legacy app and improving the user experience. + +Based on the success of the Farm app, Soma Labs decided to launch a second app for Animale, one of the biggest brands in the group, which was also completed in just 45 days! diff --git a/sites/www/content/showcase/hamilton.md b/sites/www/content/showcase/hamilton.md new file mode 100644 index 00000000000..e218f07d8b0 --- /dev/null +++ b/sites/www/content/showcase/hamilton.md @@ -0,0 +1,23 @@ +--- +title: Hamilton +description: When the team at Hamilton decided to build an app to engage fans both in and outside of the theater, they knew they needed an app. Watch the video to learn why the team turned to Flutter to help them expand the Hamilton brand beyond the stage. +headline: Hamilton +summary: Taking the Hamilton experience beyond the theater with Flutter +companyName: Hamilton +logo: images/third_party/case_studies/hamilton/logo.webp +card: images/third_party/case_studies/hamilton/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/kfd-oLypqFI" +locations: + - North America +platforms: + - Mobile +industries: + - Travel & Lifestyle +tags: + - mobile + - android + - ios +publishDate: 2021-11-05 +--- + +When the team at Hamilton decided to build an app to engage fans both in and outside of the theater, they knew they needed an app. Watch the video to learn why the team turned to Flutter to help them expand the Hamilton brand beyond the stage. diff --git a/sites/www/content/showcase/headspace.md b/sites/www/content/showcase/headspace.md new file mode 100644 index 00000000000..06d52395699 --- /dev/null +++ b/sites/www/content/showcase/headspace.md @@ -0,0 +1,23 @@ +--- +title: Headspace +description: Learn why Headspace is migrating to Flutter to deliver their mindfulness experience across mobile and the web. +headline: Headspace +summary: Bringing mental health support to millions more efficiently with Flutter +appName: Headspace +companyName: Headspace +logo: images/third_party/case_studies/headspace/logo.png +card: images/third_party/case_studies/headspace/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/q1A-c6s4UQc" +locations: + - North America +platforms: + - Mobile + - Web +industries: + - Health +tags: + - web +publishDate: 2024-12-19 +--- + +Listen to Headspace software engineer, Marcus Ng, describe why Headspace is migrating to Flutter to deliver their patent high-quality user experience for users on mobile and the web. diff --git a/sites/www/content/showcase/images/apps-in-production.gif b/sites/www/content/showcase/images/apps-in-production.gif new file mode 100644 index 00000000000..174d5443d5d Binary files /dev/null and b/sites/www/content/showcase/images/apps-in-production.gif differ diff --git a/sites/www/content/showcase/images/case_studies/expo-city-dubai/case_study_body_1.png b/sites/www/content/showcase/images/case_studies/expo-city-dubai/case_study_body_1.png new file mode 100644 index 00000000000..bf3c13345c1 Binary files /dev/null and b/sites/www/content/showcase/images/case_studies/expo-city-dubai/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/case_studies/expo-city-dubai/case_study_body_2.png b/sites/www/content/showcase/images/case_studies/expo-city-dubai/case_study_body_2.png new file mode 100644 index 00000000000..fa50768e3c7 Binary files /dev/null and b/sites/www/content/showcase/images/case_studies/expo-city-dubai/case_study_body_2.png differ diff --git a/sites/www/content/showcase/images/case_studies/expo-city-dubai/case_study_body_3.png b/sites/www/content/showcase/images/case_studies/expo-city-dubai/case_study_body_3.png new file mode 100644 index 00000000000..f7dfc8f29b9 Binary files /dev/null and b/sites/www/content/showcase/images/case_studies/expo-city-dubai/case_study_body_3.png differ diff --git a/sites/www/content/showcase/images/case_studies/expo-city-dubai/case_study_card.png b/sites/www/content/showcase/images/case_studies/expo-city-dubai/case_study_card.png new file mode 100644 index 00000000000..b131dbe5d64 Binary files /dev/null and b/sites/www/content/showcase/images/case_studies/expo-city-dubai/case_study_card.png differ diff --git a/sites/www/content/showcase/images/case_studies/expo-city-dubai/logo.png b/sites/www/content/showcase/images/case_studies/expo-city-dubai/logo.png new file mode 100644 index 00000000000..b131dbe5d64 Binary files /dev/null and b/sites/www/content/showcase/images/case_studies/expo-city-dubai/logo.png differ diff --git a/sites/www/content/showcase/images/demos/Flip_Hero_Graphic.png b/sites/www/content/showcase/images/demos/Flip_Hero_Graphic.png new file mode 100644 index 00000000000..ff5bab90417 Binary files /dev/null and b/sites/www/content/showcase/images/demos/Flip_Hero_Graphic.png differ diff --git a/sites/www/content/showcase/images/demos/dashatar.jpg b/sites/www/content/showcase/images/demos/dashatar.jpg new file mode 100644 index 00000000000..d94aaec9f54 Binary files /dev/null and b/sites/www/content/showcase/images/demos/dashatar.jpg differ diff --git a/sites/www/content/showcase/images/demos/flutter_flokk.jpg b/sites/www/content/showcase/images/demos/flutter_flokk.jpg new file mode 100644 index 00000000000..41f95d71221 Binary files /dev/null and b/sites/www/content/showcase/images/demos/flutter_flokk.jpg differ diff --git a/sites/www/content/showcase/images/demos/flutter_folio.jpg b/sites/www/content/showcase/images/demos/flutter_folio.jpg new file mode 100644 index 00000000000..61a937e6e9f Binary files /dev/null and b/sites/www/content/showcase/images/demos/flutter_folio.jpg differ diff --git a/sites/www/content/showcase/images/demos/flutter_vignette.jpg b/sites/www/content/showcase/images/demos/flutter_vignette.jpg new file mode 100644 index 00000000000..cdfeb17d4f2 Binary files /dev/null and b/sites/www/content/showcase/images/demos/flutter_vignette.jpg differ diff --git a/sites/www/content/showcase/images/demos/holobooth.png b/sites/www/content/showcase/images/demos/holobooth.png new file mode 100644 index 00000000000..f9cd8480dbb Binary files /dev/null and b/sites/www/content/showcase/images/demos/holobooth.png differ diff --git a/sites/www/content/showcase/images/demos/io_photo_booth.jpg b/sites/www/content/showcase/images/demos/io_photo_booth.jpg new file mode 100644 index 00000000000..f025aeafce9 Binary files /dev/null and b/sites/www/content/showcase/images/demos/io_photo_booth.jpg differ diff --git a/sites/www/content/showcase/images/demos/io_pinball.png b/sites/www/content/showcase/images/demos/io_pinball.png new file mode 100644 index 00000000000..4c83eb1bb69 Binary files /dev/null and b/sites/www/content/showcase/images/demos/io_pinball.png differ diff --git a/sites/www/content/showcase/images/google_apps/crowdsource_logo.webp b/sites/www/content/showcase/images/google_apps/crowdsource_logo.webp new file mode 100644 index 00000000000..398e430fa5c Binary files /dev/null and b/sites/www/content/showcase/images/google_apps/crowdsource_logo.webp differ diff --git a/sites/www/content/showcase/images/google_apps/familylink_logo.webp b/sites/www/content/showcase/images/google_apps/familylink_logo.webp new file mode 100644 index 00000000000..8970825bcd0 Binary files /dev/null and b/sites/www/content/showcase/images/google_apps/familylink_logo.webp differ diff --git a/sites/www/content/showcase/images/google_apps/fitbit_ace_logo.png b/sites/www/content/showcase/images/google_apps/fitbit_ace_logo.png new file mode 100644 index 00000000000..1d698e545f7 Binary files /dev/null and b/sites/www/content/showcase/images/google_apps/fitbit_ace_logo.png differ diff --git a/sites/www/content/showcase/images/google_apps/google_ads_logo.webp b/sites/www/content/showcase/images/google_apps/google_ads_logo.webp new file mode 100644 index 00000000000..26c15e1b821 Binary files /dev/null and b/sites/www/content/showcase/images/google_apps/google_ads_logo.webp differ diff --git a/sites/www/content/showcase/images/google_apps/google_analytics_logo.webp b/sites/www/content/showcase/images/google_apps/google_analytics_logo.webp new file mode 100644 index 00000000000..047469c4019 Binary files /dev/null and b/sites/www/content/showcase/images/google_apps/google_analytics_logo.webp differ diff --git a/sites/www/content/showcase/images/google_apps/google_classroom_logo.webp b/sites/www/content/showcase/images/google_apps/google_classroom_logo.webp new file mode 100644 index 00000000000..20c85c155bb Binary files /dev/null and b/sites/www/content/showcase/images/google_apps/google_classroom_logo.webp differ diff --git a/sites/www/content/showcase/images/google_apps/google_cloud_logo.webp b/sites/www/content/showcase/images/google_apps/google_cloud_logo.webp new file mode 100644 index 00000000000..2fc71fd8ab9 Binary files /dev/null and b/sites/www/content/showcase/images/google_apps/google_cloud_logo.webp differ diff --git a/sites/www/content/showcase/images/google_apps/google_earth_logo.webp b/sites/www/content/showcase/images/google_apps/google_earth_logo.webp new file mode 100644 index 00000000000..24398d6b943 Binary files /dev/null and b/sites/www/content/showcase/images/google_apps/google_earth_logo.webp differ diff --git a/sites/www/content/showcase/images/google_apps/google_one_logo.webp b/sites/www/content/showcase/images/google_apps/google_one_logo.webp new file mode 100644 index 00000000000..1bd02716332 Binary files /dev/null and b/sites/www/content/showcase/images/google_apps/google_one_logo.webp differ diff --git a/sites/www/content/showcase/images/google_apps/google_pay_logo.webp b/sites/www/content/showcase/images/google_apps/google_pay_logo.webp new file mode 100644 index 00000000000..8f24abeac91 Binary files /dev/null and b/sites/www/content/showcase/images/google_apps/google_pay_logo.webp differ diff --git a/sites/www/content/showcase/images/google_apps/image_1.png b/sites/www/content/showcase/images/google_apps/image_1.png new file mode 100644 index 00000000000..b40f8898b81 Binary files /dev/null and b/sites/www/content/showcase/images/google_apps/image_1.png differ diff --git a/sites/www/content/showcase/images/google_apps/readalong_logo.webp b/sites/www/content/showcase/images/google_apps/readalong_logo.webp new file mode 100644 index 00000000000..410bb2202ee Binary files /dev/null and b/sites/www/content/showcase/images/google_apps/readalong_logo.webp differ diff --git a/sites/www/content/showcase/images/google_apps/youtube_create_logo.webp b/sites/www/content/showcase/images/google_apps/youtube_create_logo.webp new file mode 100644 index 00000000000..a108c1f8202 Binary files /dev/null and b/sites/www/content/showcase/images/google_apps/youtube_create_logo.webp differ diff --git a/sites/www/content/showcase/images/showcase-quote-bg.png b/sites/www/content/showcase/images/showcase-quote-bg.png new file mode 100644 index 00000000000..e9f92f0536d Binary files /dev/null and b/sites/www/content/showcase/images/showcase-quote-bg.png differ diff --git a/sites/www/content/showcase/images/third_party/_README.md b/sites/www/content/showcase/images/third_party/_README.md new file mode 100644 index 00000000000..8188360abae --- /dev/null +++ b/sites/www/content/showcase/images/third_party/_README.md @@ -0,0 +1,13 @@ +# Third-party assets + +This directory contains logos and images belonging to third-party companies, +used here with permission for showcasing their Flutter usage. + +## License exception + +The assets in this directory are excluded from +this repository's standard license. + +These images and logos are the property of their respective owners. +To reuse, modify, redistribute, or use these assets in your own projects, +you must obtain permission from their respective owners. diff --git a/sites/www/content/showcase/images/third_party/case_studies/abbey-road-studios/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/abbey-road-studios/case_study_card.png new file mode 100644 index 00000000000..5a927df8d65 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/abbey-road-studios/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/abbey-road-studios/logo.png b/sites/www/content/showcase/images/third_party/case_studies/abbey-road-studios/logo.png new file mode 100644 index 00000000000..feecba241c8 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/abbey-road-studios/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/agape/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/agape/case_study_card.png new file mode 100644 index 00000000000..2a4ae51f831 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/agape/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/agape/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/agape/logo.webp new file mode 100644 index 00000000000..4d92bf5b2b7 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/agape/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/aira/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/aira/logo.webp new file mode 100644 index 00000000000..ec088150cca Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/aira/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/alibaba-group/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/alibaba-group/case_study_card.png new file mode 100644 index 00000000000..7cf91781eaf Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/alibaba-group/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/alibaba-group/logo.png b/sites/www/content/showcase/images/third_party/case_studies/alibaba-group/logo.png new file mode 100644 index 00000000000..95c8a4471c1 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/alibaba-group/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/anymind/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/anymind/case_study_body_1.png new file mode 100644 index 00000000000..834fa546c36 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/anymind/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/anymind/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/anymind/case_study_card.png new file mode 100644 index 00000000000..e9a2671786c Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/anymind/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/anymind/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/anymind/case_study_poster.png new file mode 100644 index 00000000000..73e276125ca Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/anymind/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/anymind/logo.png b/sites/www/content/showcase/images/third_party/case_studies/anymind/logo.png new file mode 100644 index 00000000000..c4ab55f79e8 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/anymind/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/atlas/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/atlas/case_study_body_1.png new file mode 100644 index 00000000000..b14fb649cc2 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/atlas/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/atlas/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/atlas/case_study_card.png new file mode 100644 index 00000000000..174f50b8221 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/atlas/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/atlas/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/atlas/case_study_poster.png new file mode 100644 index 00000000000..9445e62b20c Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/atlas/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/atlas/logo.png b/sites/www/content/showcase/images/third_party/case_studies/atlas/logo.png new file mode 100644 index 00000000000..158b6299876 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/atlas/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/beike/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/beike/case_study_card.png new file mode 100644 index 00000000000..ab4ca7719ec Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/beike/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/beike/logo.png b/sites/www/content/showcase/images/third_party/case_studies/beike/logo.png new file mode 100644 index 00000000000..aff67cb968c Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/beike/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/betterment/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/betterment/case_study_card.png new file mode 100644 index 00000000000..2f94fd8b822 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/betterment/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/betterment/logo.png b/sites/www/content/showcase/images/third_party/case_studies/betterment/logo.png new file mode 100644 index 00000000000..785062616e2 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/betterment/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/bmw/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/bmw/case_study_body_1.png new file mode 100644 index 00000000000..e5d3a2122f7 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/bmw/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/bmw/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/bmw/case_study_card.png new file mode 100644 index 00000000000..6c19947c590 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/bmw/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/bmw/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/bmw/case_study_poster.png new file mode 100644 index 00000000000..474f6417cc0 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/bmw/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/bmw/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/bmw/logo.webp new file mode 100644 index 00000000000..796e3009c39 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/bmw/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/bytedance/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/bytedance/case_study_body_1.png new file mode 100644 index 00000000000..535687d7031 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/bytedance/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/bytedance/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/bytedance/case_study_card.png new file mode 100644 index 00000000000..ae184e6a0d5 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/bytedance/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/bytedance/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/bytedance/case_study_poster.png new file mode 100644 index 00000000000..d0e2958c9a2 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/bytedance/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/bytedance/logo.png b/sites/www/content/showcase/images/third_party/case_studies/bytedance/logo.png new file mode 100644 index 00000000000..a58cd9a293e Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/bytedance/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/caribou-coffee/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/caribou-coffee/case_study_body_1.png new file mode 100644 index 00000000000..dc202d39604 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/caribou-coffee/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/caribou-coffee/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/caribou-coffee/case_study_card.png new file mode 100644 index 00000000000..45673156d00 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/caribou-coffee/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/caribou-coffee/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/caribou-coffee/case_study_poster.png new file mode 100644 index 00000000000..ee11ed114c1 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/caribou-coffee/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/caribou-coffee/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/caribou-coffee/logo.webp new file mode 100644 index 00000000000..149553b2201 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/caribou-coffee/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/credit-agricole/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/credit-agricole/case_study_body_1.png new file mode 100644 index 00000000000..476eebe1fa9 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/credit-agricole/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/credit-agricole/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/credit-agricole/case_study_card.png new file mode 100644 index 00000000000..12f1deed72e Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/credit-agricole/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/credit-agricole/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/credit-agricole/logo.webp new file mode 100644 index 00000000000..b817a3fea28 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/credit-agricole/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/crowdsource/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/crowdsource/case_study_body_1.png new file mode 100644 index 00000000000..e583d04fbc2 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/crowdsource/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/crowdsource/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/crowdsource/case_study_card.png new file mode 100644 index 00000000000..121a73aecb6 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/crowdsource/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/crowdsource/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/crowdsource/case_study_poster.png new file mode 100644 index 00000000000..7933cad9f2d Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/crowdsource/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/crowdsource/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/crowdsource/logo.webp new file mode 100644 index 00000000000..e80bd4fe745 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/crowdsource/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/cz-zorgverzekeringen/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/cz-zorgverzekeringen/case_study_card.png new file mode 100644 index 00000000000..a7b4ffdff95 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/cz-zorgverzekeringen/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/cz-zorgverzekeringen/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/cz-zorgverzekeringen/logo.webp new file mode 100644 index 00000000000..65f67456bbd Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/cz-zorgverzekeringen/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/dow-jones/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/dow-jones/case_study_body_1.png new file mode 100644 index 00000000000..57b76a70221 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/dow-jones/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/dow-jones/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/dow-jones/case_study_card.png new file mode 100644 index 00000000000..23294dc3ca7 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/dow-jones/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/dow-jones/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/dow-jones/case_study_poster.png new file mode 100644 index 00000000000..39111c7665c Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/dow-jones/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/dow-jones/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/dow-jones/logo.webp new file mode 100644 index 00000000000..4cf8f5e1a88 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/dow-jones/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/dream11/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/dream11/case_study_card.png new file mode 100644 index 00000000000..ed4749889c9 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/dream11/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/dream11/logo.png b/sites/www/content/showcase/images/third_party/case_studies/dream11/logo.png new file mode 100644 index 00000000000..ead82381c95 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/dream11/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/ebay/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/ebay/case_study_body_1.png new file mode 100644 index 00000000000..fe9535b0428 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/ebay/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/ebay/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/ebay/case_study_card.png new file mode 100644 index 00000000000..7a106ba6523 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/ebay/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/ebay/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/ebay/case_study_poster.png new file mode 100644 index 00000000000..85658249ec6 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/ebay/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/ebay/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/ebay/logo.webp new file mode 100644 index 00000000000..0a9f701e4e1 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/ebay/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/etermax/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/etermax/case_study_body_1.png new file mode 100644 index 00000000000..5d6453a890b Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/etermax/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/etermax/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/etermax/case_study_card.png new file mode 100644 index 00000000000..a475fc613af Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/etermax/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/etermax/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/etermax/case_study_poster.png new file mode 100644 index 00000000000..eeaa5c01626 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/etermax/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/etermax/logo.png b/sites/www/content/showcase/images/third_party/case_studies/etermax/logo.png new file mode 100644 index 00000000000..edd1b885887 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/etermax/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/google-classroom/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/google-classroom/case_study_card.png new file mode 100644 index 00000000000..203464fabc3 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/google-classroom/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/google-classroom/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/google-classroom/logo.webp new file mode 100644 index 00000000000..20c85c155bb Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/google-classroom/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/google-pay/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/google-pay/case_study_body_1.png new file mode 100644 index 00000000000..1454cb1f223 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/google-pay/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/google-pay/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/google-pay/case_study_card.png new file mode 100644 index 00000000000..6ad70fdee04 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/google-pay/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/google-pay/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/google-pay/case_study_poster.png new file mode 100644 index 00000000000..9ad1dd46c0a Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/google-pay/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/google-pay/logo.png b/sites/www/content/showcase/images/third_party/case_studies/google-pay/logo.png new file mode 100644 index 00000000000..a5a0dd48e69 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/google-pay/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/grupo-soma/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/grupo-soma/case_study_body_1.png new file mode 100644 index 00000000000..e188154491a Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/grupo-soma/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/grupo-soma/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/grupo-soma/case_study_card.png new file mode 100644 index 00000000000..3a8b3686abe Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/grupo-soma/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/grupo-soma/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/grupo-soma/case_study_poster.png new file mode 100644 index 00000000000..3a703557402 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/grupo-soma/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/grupo-soma/logo.png b/sites/www/content/showcase/images/third_party/case_studies/grupo-soma/logo.png new file mode 100644 index 00000000000..27e89fce759 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/grupo-soma/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/hamilton/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/hamilton/case_study_card.png new file mode 100644 index 00000000000..ed9ed802c5c Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/hamilton/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/hamilton/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/hamilton/logo.webp new file mode 100644 index 00000000000..101f5fab8e9 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/hamilton/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/headspace/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/headspace/case_study_card.png new file mode 100644 index 00000000000..c642a9eb650 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/headspace/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/headspace/logo.png b/sites/www/content/showcase/images/third_party/case_studies/headspace/logo.png new file mode 100644 index 00000000000..e2f6a76bebf Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/headspace/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/kakao-mobility/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/kakao-mobility/case_study_body_1.png new file mode 100644 index 00000000000..65cc688a1da Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/kakao-mobility/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/kakao-mobility/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/kakao-mobility/case_study_card.png new file mode 100644 index 00000000000..1cd3f9d1b61 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/kakao-mobility/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/kakao-mobility/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/kakao-mobility/case_study_poster.png new file mode 100644 index 00000000000..bcc62ffdbde Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/kakao-mobility/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/kakao-mobility/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/kakao-mobility/logo.webp new file mode 100644 index 00000000000..e894252031c Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/kakao-mobility/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/kijiji1/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/kijiji1/case_study_body_1.png new file mode 100644 index 00000000000..b71c4ea19e5 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/kijiji1/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/kijiji1/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/kijiji1/case_study_card.png new file mode 100644 index 00000000000..da196a43403 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/kijiji1/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/kijiji1/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/kijiji1/case_study_poster.png new file mode 100644 index 00000000000..04179e9dafe Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/kijiji1/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/kijiji1/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/kijiji1/logo.webp new file mode 100644 index 00000000000..441b1027b73 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/kijiji1/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/kikoff/Kikoff_Flutter_Header.png b/sites/www/content/showcase/images/third_party/case_studies/kikoff/Kikoff_Flutter_Header.png new file mode 100644 index 00000000000..fdb2cc4b11c Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/kikoff/Kikoff_Flutter_Header.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/kikoff/Kikoff_Flutter_MiddlePage.png b/sites/www/content/showcase/images/third_party/case_studies/kikoff/Kikoff_Flutter_MiddlePage.png new file mode 100644 index 00000000000..efae52e7f70 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/kikoff/Kikoff_Flutter_MiddlePage.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/kikoff/kikoff-credit-page-1.png b/sites/www/content/showcase/images/third_party/case_studies/kikoff/kikoff-credit-page-1.png new file mode 100644 index 00000000000..8cd29e6ad87 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/kikoff/kikoff-credit-page-1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/kikoff/kikoff-logo-635-470.png b/sites/www/content/showcase/images/third_party/case_studies/kikoff/kikoff-logo-635-470.png new file mode 100644 index 00000000000..2123ae19768 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/kikoff/kikoff-logo-635-470.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/klasha/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/klasha/case_study_card.png new file mode 100644 index 00000000000..0d002f0c96e Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/klasha/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/klasha/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/klasha/logo.webp new file mode 100644 index 00000000000..a57c07f183d Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/klasha/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/lg-electronics/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/lg-electronics/case_study_card.png new file mode 100644 index 00000000000..3e4944c8555 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/lg-electronics/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/lg-electronics/logo.png b/sites/www/content/showcase/images/third_party/case_studies/lg-electronics/logo.png new file mode 100644 index 00000000000..565dc00e80d Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/lg-electronics/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/lotum/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/lotum/case_study_body_1.png new file mode 100644 index 00000000000..4d34e884ca7 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/lotum/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/lotum/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/lotum/case_study_card.png new file mode 100644 index 00000000000..d977af1c7a7 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/lotum/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/lotum/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/lotum/case_study_poster.png new file mode 100644 index 00000000000..59b9e0aae1d Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/lotum/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/lotum/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/lotum/logo.webp new file mode 100644 index 00000000000..4dfb88a9b69 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/lotum/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/lucid-motors/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/lucid-motors/case_study_body_1.png new file mode 100644 index 00000000000..fb0e55e6fd5 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/lucid-motors/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/lucid-motors/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/lucid-motors/case_study_card.png new file mode 100644 index 00000000000..0ee5c5e3a6d Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/lucid-motors/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/lucid-motors/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/lucid-motors/case_study_poster.png new file mode 100644 index 00000000000..9f96ca42f88 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/lucid-motors/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/lucid-motors/logo.png b/sites/www/content/showcase/images/third_party/case_studies/lucid-motors/logo.png new file mode 100644 index 00000000000..c54b56e07d0 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/lucid-motors/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/mgm-resorts/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/mgm-resorts/case_study_card.png new file mode 100644 index 00000000000..8b66dbf39af Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/mgm-resorts/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/mgm-resorts/logo.png b/sites/www/content/showcase/images/third_party/case_studies/mgm-resorts/logo.png new file mode 100644 index 00000000000..82addc3f188 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/mgm-resorts/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/monta/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/monta/case_study_body_1.png new file mode 100644 index 00000000000..d871e5f49ad Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/monta/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/monta/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/monta/case_study_card.png new file mode 100644 index 00000000000..6744e9ae009 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/monta/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/monta/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/monta/case_study_poster.png new file mode 100644 index 00000000000..fd07519af3d Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/monta/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/monta/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/monta/logo.webp new file mode 100644 index 00000000000..86bd1f28008 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/monta/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/notebooklm/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/notebooklm/case_study_card.png new file mode 100644 index 00000000000..7ffca1250e0 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/notebooklm/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/notebooklm/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/notebooklm/case_study_poster.png new file mode 100644 index 00000000000..49ede1b5b3f Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/notebooklm/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/notebooklm/logo.png b/sites/www/content/showcase/images/third_party/case_studies/notebooklm/logo.png new file mode 100644 index 00000000000..deff9bbd3df Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/notebooklm/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/nubank/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/nubank/case_study_body_1.png new file mode 100644 index 00000000000..7e92573ade4 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/nubank/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/nubank/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/nubank/case_study_card.png new file mode 100644 index 00000000000..be3fb46925c Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/nubank/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/nubank/logo.jpg b/sites/www/content/showcase/images/third_party/case_studies/nubank/logo.jpg new file mode 100644 index 00000000000..a059ad5b73c Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/nubank/logo.jpg differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/onrizon-games/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/onrizon-games/case_study_body_1.png new file mode 100644 index 00000000000..af90e8e4f44 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/onrizon-games/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/onrizon-games/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/onrizon-games/case_study_poster.png new file mode 100644 index 00000000000..d26e2b9c2cb Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/onrizon-games/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/onrizon-games/logo.png b/sites/www/content/showcase/images/third_party/case_studies/onrizon-games/logo.png new file mode 100644 index 00000000000..aaff2a5720d Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/onrizon-games/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/patchme-eye-patch-tracking/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/patchme-eye-patch-tracking/case_study_card.png new file mode 100644 index 00000000000..731b18c1946 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/patchme-eye-patch-tracking/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/patchme-eye-patch-tracking/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/patchme-eye-patch-tracking/logo.webp new file mode 100644 index 00000000000..aceb307273d Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/patchme-eye-patch-tracking/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/pubg-mobile/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/pubg-mobile/case_study_card.png new file mode 100644 index 00000000000..411c8ed3e45 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/pubg-mobile/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/pubg-mobile/logo.jpg b/sites/www/content/showcase/images/third_party/case_studies/pubg-mobile/logo.jpg new file mode 100644 index 00000000000..0d3da24a350 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/pubg-mobile/logo.jpg differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/push/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/push/case_study_card.png new file mode 100644 index 00000000000..7e1e495ef3c Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/push/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/push/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/push/logo.webp new file mode 100644 index 00000000000..224bbd08849 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/push/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/quintoandar/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/quintoandar/case_study_body_1.png new file mode 100644 index 00000000000..c02262a19e9 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/quintoandar/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/quintoandar/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/quintoandar/case_study_card.png new file mode 100644 index 00000000000..b88d18c6763 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/quintoandar/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/quintoandar/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/quintoandar/case_study_poster.png new file mode 100644 index 00000000000..a9ee6556eb5 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/quintoandar/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/quintoandar/logo.png b/sites/www/content/showcase/images/third_party/case_studies/quintoandar/logo.png new file mode 100644 index 00000000000..d7d75d5cb77 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/quintoandar/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/reflectionapp/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/reflectionapp/case_study_body_1.png new file mode 100644 index 00000000000..35167d41c51 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/reflectionapp/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/reflectionapp/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/reflectionapp/case_study_card.png new file mode 100644 index 00000000000..8ba2f5b0836 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/reflectionapp/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/reflectionapp/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/reflectionapp/case_study_poster.png new file mode 100644 index 00000000000..6965f49de02 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/reflectionapp/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/reflectionapp/logo.png b/sites/www/content/showcase/images/third_party/case_studies/reflectionapp/logo.png new file mode 100644 index 00000000000..713450a036f Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/reflectionapp/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/reflectly/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/reflectly/case_study_card.png new file mode 100644 index 00000000000..f6fc58cb2f5 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/reflectly/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/reflectly/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/reflectly/logo.webp new file mode 100644 index 00000000000..d71a5f6246b Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/reflectly/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/rive/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/rive/case_study_card.png new file mode 100644 index 00000000000..22ae2a7e158 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/rive/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/rive/logo.png b/sites/www/content/showcase/images/third_party/case_studies/rive/logo.png new file mode 100644 index 00000000000..9db477176ba Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/rive/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/robert-felker/logo.png b/sites/www/content/showcase/images/third_party/case_studies/robert-felker/logo.png new file mode 100644 index 00000000000..b25b8f1897c Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/robert-felker/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/romwe-fashion-shein/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/romwe-fashion-shein/case_study_body_1.png new file mode 100644 index 00000000000..777119e825f Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/romwe-fashion-shein/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/romwe-fashion-shein/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/romwe-fashion-shein/case_study_poster.png new file mode 100644 index 00000000000..de588ac8e1c Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/romwe-fashion-shein/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/romwe-fashion-shein/logo.png b/sites/www/content/showcase/images/third_party/case_studies/romwe-fashion-shein/logo.png new file mode 100644 index 00000000000..216845462b7 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/romwe-fashion-shein/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/rows/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/rows/case_study_card.png new file mode 100644 index 00000000000..8f5e6cb6155 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/rows/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/rows/logo.png b/sites/www/content/showcase/images/third_party/case_studies/rows/logo.png new file mode 100644 index 00000000000..fbbfb93dd06 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/rows/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/samlabs/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/samlabs/case_study_body_1.png new file mode 100644 index 00000000000..12ed55b0c99 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/samlabs/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/samlabs/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/samlabs/case_study_card.png new file mode 100644 index 00000000000..5b701fbeef6 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/samlabs/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/samlabs/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/samlabs/case_study_poster.png new file mode 100644 index 00000000000..736e0ad52d5 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/samlabs/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/samlabs/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/samlabs/logo.webp new file mode 100644 index 00000000000..9d854b80b51 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/samlabs/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/skandia/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/skandia/case_study_body_1.png new file mode 100644 index 00000000000..c8b6afc7b43 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/skandia/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/skandia/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/skandia/case_study_card.png new file mode 100644 index 00000000000..af192675a50 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/skandia/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/skandia/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/skandia/case_study_poster.png new file mode 100644 index 00000000000..ff78b88f50e Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/skandia/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/skandia/logo.png b/sites/www/content/showcase/images/third_party/case_studies/skandia/logo.png new file mode 100644 index 00000000000..0c211d851b7 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/skandia/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/sncf-connect/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/sncf-connect/case_study_body_1.png new file mode 100644 index 00000000000..c6e8bc10751 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/sncf-connect/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/sncf-connect/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/sncf-connect/case_study_card.png new file mode 100644 index 00000000000..1f579654058 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/sncf-connect/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/sncf-connect/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/sncf-connect/case_study_poster.png new file mode 100644 index 00000000000..edf2c7ec617 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/sncf-connect/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/sncf-connect/logo.png b/sites/www/content/showcase/images/third_party/case_studies/sncf-connect/logo.png new file mode 100644 index 00000000000..90606bd237e Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/sncf-connect/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/so-vegan/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/so-vegan/case_study_body_1.png new file mode 100644 index 00000000000..bc2cdd41969 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/so-vegan/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/so-vegan/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/so-vegan/case_study_card.png new file mode 100644 index 00000000000..798dee2951b Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/so-vegan/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/so-vegan/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/so-vegan/case_study_poster.png new file mode 100644 index 00000000000..8030dfb533e Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/so-vegan/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/so-vegan/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/so-vegan/logo.webp new file mode 100644 index 00000000000..90acb03e530 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/so-vegan/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/sozcu/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/sozcu/case_study_body_1.png new file mode 100644 index 00000000000..0455c6575b8 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/sozcu/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/sozcu/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/sozcu/case_study_card.png new file mode 100644 index 00000000000..7148938dc73 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/sozcu/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/sozcu/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/sozcu/case_study_poster.png new file mode 100644 index 00000000000..afca43e63c2 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/sozcu/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/sozcu/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/sozcu/logo.webp new file mode 100644 index 00000000000..4fb2dfd3292 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/sozcu/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/stage/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/stage/case_study_body_1.png new file mode 100644 index 00000000000..a165e54f9c8 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/stage/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/stage/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/stage/case_study_card.png new file mode 100644 index 00000000000..2bb7f591555 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/stage/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/stage/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/stage/case_study_poster.png new file mode 100644 index 00000000000..d25214e83e5 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/stage/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/stage/logo.png b/sites/www/content/showcase/images/third_party/case_studies/stage/logo.png new file mode 100644 index 00000000000..147cb316bab Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/stage/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/sua-musica/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/sua-musica/case_study_card.png new file mode 100644 index 00000000000..f44d36e2c1e Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/sua-musica/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/sua-musica/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/sua-musica/logo.webp new file mode 100644 index 00000000000..c69149304eb Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/sua-musica/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/supercell/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/supercell/case_study_body_1.png new file mode 100644 index 00000000000..cf3a42d7050 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/supercell/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/supercell/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/supercell/case_study_card.png new file mode 100644 index 00000000000..ddd393ff338 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/supercell/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/supercell/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/supercell/case_study_poster.png new file mode 100644 index 00000000000..a84c9ac9e3e Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/supercell/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/supercell/logo.png b/sites/www/content/showcase/images/third_party/case_studies/supercell/logo.png new file mode 100644 index 00000000000..2865aa64ca9 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/supercell/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/superlist/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/superlist/case_study_card.png new file mode 100644 index 00000000000..de0724797ab Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/superlist/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/superlist/logo.png b/sites/www/content/showcase/images/third_party/case_studies/superlist/logo.png new file mode 100644 index 00000000000..7fd21833ae8 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/superlist/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/supernova/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/supernova/case_study_card.png new file mode 100644 index 00000000000..5ab5fc098cc Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/supernova/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/supernova/logo.jpeg b/sites/www/content/showcase/images/third_party/case_studies/supernova/logo.jpeg new file mode 100644 index 00000000000..5ad70c75eb2 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/supernova/logo.jpeg differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/talabat/talabat_card.png b/sites/www/content/showcase/images/third_party/case_studies/talabat/talabat_card.png new file mode 100644 index 00000000000..f4246b5c1b8 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/talabat/talabat_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/talabat/talabat_logo.png b/sites/www/content/showcase/images/third_party/case_studies/talabat/talabat_logo.png new file mode 100644 index 00000000000..2f9fbe23275 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/talabat/talabat_logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/tatsuya-inoue/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/tatsuya-inoue/case_study_body_1.png new file mode 100644 index 00000000000..c585f6df629 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/tatsuya-inoue/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/tatsuya-inoue/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/tatsuya-inoue/case_study_card.png new file mode 100644 index 00000000000..d6155e32904 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/tatsuya-inoue/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/tatsuya-inoue/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/tatsuya-inoue/case_study_poster.png new file mode 100644 index 00000000000..1385952ae98 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/tatsuya-inoue/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/tatsuya-inoue/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/tatsuya-inoue/logo.webp new file mode 100644 index 00000000000..1b316bd3df0 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/tatsuya-inoue/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/teamlab/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/teamlab/case_study_card.png new file mode 100644 index 00000000000..a37942db7c0 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/teamlab/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/teamlab/logo.png b/sites/www/content/showcase/images/third_party/case_studies/teamlab/logo.png new file mode 100644 index 00000000000..8ed0ea74117 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/teamlab/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/tencent-cloud-chat/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/tencent-cloud-chat/case_study_body_1.png new file mode 100644 index 00000000000..0e5c818dd28 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/tencent-cloud-chat/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/tencent-cloud-chat/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/tencent-cloud-chat/case_study_card.png new file mode 100644 index 00000000000..f14e6788c1e Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/tencent-cloud-chat/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/tencent-cloud-chat/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/tencent-cloud-chat/case_study_poster.png new file mode 100644 index 00000000000..79976bbfd9e Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/tencent-cloud-chat/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/tencent-cloud-chat/logo.png b/sites/www/content/showcase/images/third_party/case_studies/tencent-cloud-chat/logo.png new file mode 100644 index 00000000000..b405cd7a4d8 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/tencent-cloud-chat/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/tencent/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/tencent/case_study_card.png new file mode 100644 index 00000000000..a607d6e9396 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/tencent/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/tencent/logo.png b/sites/www/content/showcase/images/third_party/case_studies/tencent/logo.png new file mode 100644 index 00000000000..7f7567af246 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/tencent/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/tonal/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/tonal/case_study_body_1.png new file mode 100644 index 00000000000..e93d9fbcd37 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/tonal/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/tonal/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/tonal/case_study_card.png new file mode 100644 index 00000000000..fa1d47031bb Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/tonal/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/tonal/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/tonal/logo.webp new file mode 100644 index 00000000000..b3d74f4a7ed Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/tonal/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/toyota/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/toyota/case_study_body_1.png new file mode 100644 index 00000000000..3220eb66da9 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/toyota/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/toyota/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/toyota/case_study_card.png new file mode 100644 index 00000000000..968c42f102d Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/toyota/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/toyota/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/toyota/case_study_poster.png new file mode 100644 index 00000000000..cd9f57f6f9e Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/toyota/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/toyota/logo.jpeg b/sites/www/content/showcase/images/third_party/case_studies/toyota/logo.jpeg new file mode 100644 index 00000000000..70786f776ee Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/toyota/logo.jpeg differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/travelstart/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/travelstart/case_study_body_1.png new file mode 100644 index 00000000000..5eab7afb04c Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/travelstart/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/travelstart/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/travelstart/case_study_card.png new file mode 100644 index 00000000000..3f312482a61 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/travelstart/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/travelstart/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/travelstart/case_study_poster.png new file mode 100644 index 00000000000..a49c1368ef9 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/travelstart/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/travelstart/logo.png b/sites/www/content/showcase/images/third_party/case_studies/travelstart/logo.png new file mode 100644 index 00000000000..7cadfb27d9b Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/travelstart/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/universal-studios/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/universal-studios/case_study_card.png new file mode 100644 index 00000000000..0fab31517d1 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/universal-studios/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/universal-studios/logo.png b/sites/www/content/showcase/images/third_party/case_studies/universal-studios/logo.png new file mode 100644 index 00000000000..6f40b7c2261 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/universal-studios/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/us-department-of-veterans-affairs/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/us-department-of-veterans-affairs/case_study_card.png new file mode 100644 index 00000000000..7ee9e715037 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/us-department-of-veterans-affairs/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/us-department-of-veterans-affairs/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/us-department-of-veterans-affairs/logo.webp new file mode 100644 index 00000000000..76c6b764adb Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/us-department-of-veterans-affairs/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/virgin-money/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/virgin-money/case_study_body_1.png new file mode 100644 index 00000000000..fc792ba2e03 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/virgin-money/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/virgin-money/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/virgin-money/case_study_card.png new file mode 100644 index 00000000000..d0520189eee Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/virgin-money/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/virgin-money/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/virgin-money/case_study_poster.png new file mode 100644 index 00000000000..c32789e7a39 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/virgin-money/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/virgin-money/logo.png b/sites/www/content/showcase/images/third_party/case_studies/virgin-money/logo.png new file mode 100644 index 00000000000..a6a7d24c4fd Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/virgin-money/logo.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/wallace-gromit-ar/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/wallace-gromit-ar/case_study_card.png new file mode 100644 index 00000000000..0d87b0c1272 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/wallace-gromit-ar/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/wallace-gromit-ar/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/wallace-gromit-ar/logo.webp new file mode 100644 index 00000000000..5631f28c239 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/wallace-gromit-ar/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/whirlpool/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/whirlpool/case_study_body_1.png new file mode 100644 index 00000000000..a95b0e56c27 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/whirlpool/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/whirlpool/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/whirlpool/case_study_card.png new file mode 100644 index 00000000000..8c6677d2871 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/whirlpool/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/whirlpool/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/whirlpool/case_study_poster.png new file mode 100644 index 00000000000..3e46e2785de Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/whirlpool/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/whirlpool/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/whirlpool/logo.webp new file mode 100644 index 00000000000..92a589b4ae6 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/whirlpool/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/wolt/case_study_body_1.png b/sites/www/content/showcase/images/third_party/case_studies/wolt/case_study_body_1.png new file mode 100644 index 00000000000..24fd405fb44 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/wolt/case_study_body_1.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/wolt/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/wolt/case_study_card.png new file mode 100644 index 00000000000..1a215460da0 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/wolt/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/wolt/case_study_poster.png b/sites/www/content/showcase/images/third_party/case_studies/wolt/case_study_poster.png new file mode 100644 index 00000000000..611f572a366 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/wolt/case_study_poster.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/wolt/logo.webp b/sites/www/content/showcase/images/third_party/case_studies/wolt/logo.webp new file mode 100644 index 00000000000..6982ff08eba Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/wolt/logo.webp differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/xiaomi/case_study_card.png b/sites/www/content/showcase/images/third_party/case_studies/xiaomi/case_study_card.png new file mode 100644 index 00000000000..b5398e46930 Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/xiaomi/case_study_card.png differ diff --git a/sites/www/content/showcase/images/third_party/case_studies/xiaomi/logo.png b/sites/www/content/showcase/images/third_party/case_studies/xiaomi/logo.png new file mode 100644 index 00000000000..333a1df6e6e Binary files /dev/null and b/sites/www/content/showcase/images/third_party/case_studies/xiaomi/logo.png differ diff --git a/sites/www/content/showcase/index.md b/sites/www/content/showcase/index.md new file mode 100644 index 00000000000..4ee043bc05c --- /dev/null +++ b/sites/www/content/showcase/index.md @@ -0,0 +1,8 @@ +--- +title: Showcase +bodyTags: interior showcase +description: The world’s biggest businesses are building with Flutter. View the showcase and see Flutter apps in production. +publishDate: 2021-10-21 +--- + + diff --git a/sites/www/content/showcase/kakao-mobility.md b/sites/www/content/showcase/kakao-mobility.md new file mode 100644 index 00000000000..c39452af43e --- /dev/null +++ b/sites/www/content/showcase/kakao-mobility.md @@ -0,0 +1,45 @@ +--- +title: Kakao Mobility +description: Driven by the belief that all people should be able to move freely in their daily lives, Korean developer Kakao Mobility offers easy-to-access mobility services from taxis, drivers, and e-bikes to car maintenance and express delivery. +headline: Kakao Mobility +summary: Kakao Mobility expands their business with Flutter +appName: Kakao Mobility +companyName: Kakao Mobility +logo: images/third_party/case_studies/kakao-mobility/logo.webp +card: images/third_party/case_studies/kakao-mobility/case_study_card.png +poster: images/third_party/case_studies/kakao-mobility/case_study_poster.png +locations: + - Asia +platforms: + - Mobile + - Web +industries: + - Travel & Lifestyle +publishDate: 2024-09-12 +--- + +**Goal** + +As part of their mission to make transportation available for all, Kakao Mobility offers an ever-growing suite of apps designed to serve various mobility needs. Two of their most popular services — [Kakao T](https://play.google.com/store/apps/details?id=com.kakao.taxi) and [Kakao Navi](https://play.google.com/store/apps/details?id=com.locnall.KimGiSa) — provide over 30 million people with reliable ride-calling and navigation services, respectively. But in the IT industry, where there is always a sense of lacking development resources, speed and efficiency are absolutely essential. + +Before launching the new standalone service app, k.ride, a taxi service designed for non-Korean visitors, the team needed a way to scale more efficiently. They needed a platform that would allow them to quickly launch new global projects with limited manpower, and maintain the same look and feel across Android, iOS, and Web. + +**Why Flutter?** + +Based on a recommendation from a trusted colleague, the Kakao Mobility team explored documentation on Flutter.dev. They liked Flutter’s multi platform capabilities, and as existing users of several Google products — including Google Maps,Translate, and Firebase App Distribution, Crashlytics, Storage, and Messaging — its seamless integration with these tools was a major selling point. + +As a proof of concept, the team built a wireframe test project in just five minutes. Sold on the ease of use and quick learning curve, Kakao Mobility decided to move forward with Flutter. + + + +**Their solution** + +Encouraged by Flutter’s ease of use, Kakao Mobility built a new team within the company to handle the new project. They found Flutter's high portability across platforms especially useful, as they needed to use several elements from their existing apps. Loading features from Flutter was easy, as they could simply implement the features on each platform without developing additional UI for each one. Android and iOS results were solved simultaneously from one code base, and when partial web production was required, they were able to work with Flutter without the need for separate web developer resources. + +"*The next time we choose a technology stack for a new project, we will choose Flutter without hesitation."* + +*- *New Global Service Team, Kakao Mobility + +**Results** + +Kakao Mobility launched [k.ride](https://play.google.com/store/apps/details?id=com.kakaomobility.kride), a taxi app designed for global travelers, on May 22, 2024. Currently in public beta, k.ride is on track to launch in 30-40 additional countries within the next few months. Just as they’d hoped, they were able to launch quickly and with a small team. Based on their success, Kakao Mobility intends to continue using Flutter as they scale their app portfolio even further. diff --git a/sites/www/content/showcase/kijiji1.md b/sites/www/content/showcase/kijiji1.md new file mode 100644 index 00000000000..89dd7c4b44b --- /dev/null +++ b/sites/www/content/showcase/kijiji1.md @@ -0,0 +1,65 @@ +--- +title: Kijiji +description: >- + Since 2005, Kijiji has been a leader in helping millions of Canadians buy and sell locally and + sustainably across 400 categories including Autos, Real Estate, Home, Electronics, Services, Pets and + Auto parts. +headline: Kijiji +summary: Kijiji launches features faster with Flutter +appName: Kijiji +companyName: Kijiji +logo: images/third_party/case_studies/kijiji1/logo.webp +card: images/third_party/case_studies/kijiji1/case_study_card.png +poster: images/third_party/case_studies/kijiji1/case_study_poster.png +locations: + - North America +platforms: + - Mobile +industries: + - Travel & Lifestyle +successMetrics: + - perc: 50 + desc: reduction in time required to launch new features + - perc: 64 + desc: reduction in size of codebase +tags: + - android + - ios +publishDate: 2023-03-28 +--- + +**Goal** + +With nearly 11 million monthly active users, the Kijiji mobile app needs to be fast, reliable, and consistent across platforms. However, after several years, Kijiji’s native apps had grown to millions of lines of code and incurred a significant amount of technical debt. The team needed a way to streamline their codebase, reach feature parity between platforms, and keep the app running smoothly for users. + +**Why Flutter?** + +The team considered several native and cross-platform solutions, and on a recommendation from senior leadership, decided to look into Flutter. As an experiment, they ran a two-day internal hackathon with every web, backend, and mobile developer at Kijiji to rebuild and reimagine their existing feature sets in Flutter. + +“We were really impressed with the ability Flutter gave our team to be creative and create the changes our customers were looking for effectively and efficiently,” said Mike Baxter, Chief Technology Officer at Kijiji. + +After the hackathon, they gathered feedback on the developers' experiences. Across the board, the development team really enjoyed working with Flutter and it was apparent it would help the team overcome many of their existing concerns, so they decided to make the switch. + + + +**Their solution** + +Kijiji hired an experienced Flutter architect to lead the team in rebuilding their mobile apps. + +Rebuilding their native apps in Flutter allowed them to wipe out their technical debt and start with a clean slate. Building cross-platform from the start also allowed them to deploy features with parity on iOS and Android, which had been a challenge in the past. Platform-specific constraints sometimes made it tough to maintain a consistent experience cross-platform, but Flutter made it easier to deploy in tandem. + +For example, in their native apps, the team had created a large number of custom views and reusable components throughout the codebase. But for those components to actually be reusable, they had to overload them with functionality to make them applicable to every scenario. Not only did that involve a lot of extra code, it meant that if one custom view broke, it would break in multiple places throughout the app. + +When they migrated to Flutter, the team chose to leverage widgets instead, keeping each widget and component self-contained. That allowed multiple developers to work on different parts of the app at once without stepping on anyone's toes. It also constrained the components to the functionality that is required and reduced the amount of code they needed to write. + +“*Flutter is a first-class development environment. Even if you are a native developer, the ramp-up is relatively quick, and the software truly enabled our team to modernize our app and create a more seamless customer experience.*” + +-Mike Baxter, Chief Technology Officer, Kijiji + +**Results** + +Migrating to Flutter has saved Kijiji a significant amount of development time, enabling them to quickly offer an improved app experience for Canadians. The original Kijiji native apps took about 2-3 years to build for each platform, or about 6 development years in total. Flutter enabled them to recreate the core features of the Kijiji mobile app in just 9 months. While it used to take an average of 2-4 sprints to release a major feature, Flutter has allowed them to launch new features in half the time, freeing the team to innovate, iterate and go to market faster with new features their customers are asking for. + +The team has also been able to hire talented developers more quickly by standing out from the competition. Their original mobile team consisted of 4 iOS and 4 Android developers, hired over a period of 2 years, but they were able to hire 12 experienced Flutter developers within 6 months. + +Finally, the Kijiji team were able to drastically reduce the number of libraries and dependencies they relied on for a more streamlined experience. They were able to reduce their codebase from over 2.5M lines of code in their native Android app to approximately 900k with 100% code coverage, making it much easier to maintain and avoid future technical debt. After final feature validation, the Kijiji team rolled out their new Flutter app to users on March 7/23. diff --git a/sites/www/content/showcase/kikoff.md b/sites/www/content/showcase/kikoff.md new file mode 100644 index 00000000000..50803d8be91 --- /dev/null +++ b/sites/www/content/showcase/kikoff.md @@ -0,0 +1,74 @@ +--- +title: Kikoff +description: Kikoff is a personal finance platform on a mission to empower everyone to achieve financial security. Through simple, affordable products powered by technology and AI, Kikoff helps people build credit, lower debt, and move toward lasting financial stability. +headline: Kikoff +summary: Empowering financial security with Flutter +companyName: Kikoff +logo: images/third_party/case_studies/kikoff/kikoff-logo-635-470.png +card: images/third_party/case_studies/kikoff/kikoff-logo-635-470.png +locations: + - North America +platforms: + - Mobile +industries: + - Banking & Finance +successMetrics: + - text: 100% + desc: Code reuse across platforms + - text: Millions + desc: of users with a small team +tags: + - mobile + - android + - ios + - ai +publishDate: 2026-04-16 +--- + +Kikoff is a personal financial technology company on a mission to empower everyone to achieve financial security. Through its growing suite of products—including Kikoff, Grant, and Catch—the company helps users [build credit](https://kikoff.com/how-kikoff-works), [access liquidity](https://www.grantcash.com/), save money, and unlock greater financial opportunity. Learn more at [about.kikoff.com](http://about.kikoff.com/) + +Kikoff Flutter Header image + +**Why Flutter?** + +Kikoff chose Flutter at a very early stage of the company, when the team was small and needed to move fast with limited resources. The ability to build both iOS and Android applications from a single codebase was a key factor, allowing the team to maximize impact with a lean engineering group. + +Kikoff Flutter middle page image + +Flutter’s developer experience also played a major role. Dart was easy to pick up for engineers coming from different backgrounds and we really liked its strong typing, which helped us catch issues early and keep the codebase more reliable. Features like hot reload enabled rapid iteration and experimentation, which was especially important in the early days, where product decisions needed to be validated quickly. + +Performance was another critical consideration. Flutter delivered near-native performance out of the box, making it possible to build smooth, responsive user experiences without the overhead of maintaining separate native teams. + +Finally, Flutter’s flexibility enabled the team to gradually evolve the product. Early on, parts of the app leveraged webviews to reuse existing web functionality, helping accelerate time to market while maintaining a path toward fully native experiences over time. + +**Their solution: Building with Flutter** + +Kikoff built its mobile application entirely with Flutter, starting from a small MVP and scaling it into a robust platform used by millions. In the early stages, the team combined Flutter with webviews to reuse existing web infrastructure, which significantly reduced development time while the product was still evolving. + +As the app matured, more features were migrated to fully native Flutter implementations, enabling better performance and tighter control over the user experience. The team relied heavily on Flutter’s reactive UI model and efficient rendering pipeline to deliver smooth and consistent interactions across devices. + +Developer productivity was enhanced through tools like hot reload, enabling engineers to iterate quickly on UI and logic. Internally, the team also built custom tools within the app to simulate different screen sizes, monitor analytics, and run extensive A/B testing.This included key iterations on core product surfaces such as Credit Page and marketplace center, where contributors including Diego Velasquez, Mufeng Xie, William Walsh, and Wilson Ding played key roles in improving user engagement and product experience through continuous experimentation, leveraging Flutter's flexible UI framework and fast iteration capabilities. + +More recently, Kikoff has integrated AI-driven features directly into the app experience. One example is Fynn, an in-app financial coach that helps users improve their credit score through personalized recommendations and actionable steps embedded within a conversational interface. + +To further accelerate delivery, the team adopted tools like Shorebird to enable over-the-air updates, reducing the dependency on app store release cycles and allowing faster iteration. + +Today, Flutter continues to power not only Kikoff’s main application but also additional products (such as [Cash Advanced](https://www.google.com/url?q=https://play.google.com/store/apps/details?id%3Dcom.kikoff.theseus&sa=D&source=docs&ust=1777326565057908&usg=AOvVaw0cHdgjTUd2Va8qRE7nzBsR) and [Catch](https://www.google.com/url?q=https://play.google.com/store/apps/details?id%3Dcom.kikoff.zenith&sa=D&source=docs&ust=1777326565057960&usg=AOvVaw0R63tfXoio8fTr3xj7Oi9s)), thanks to its strong performance, scalability, and excellent developer experience. + +**Key results and business impact** + +Kikoff’s investment in Flutter enabled the team to scale both the product and the organization efficiently: + +* Built and launched a full-featured mobile app for iOS and Android with a single codebase from day one +* Achieved close to 100% code reuse across platforms, significantly reducing maintenance overhead +* Scaled to over 1 million users with a mobile team of just 4 engineers +* Continued growth to millions of users while expanding into multiple Flutter-based applications +* Maintained consistently smooth performance across devices, delivering responsive UI and fluid animations +* Dramatically improved developer velocity through hot reload, internal tooling, and rapid iteration workflows +* Reduced time-to-market for new features through A/B testing and integrated analytics within the app +* Accelerated release cycles using over-the-air updates, minimizing delays from app store approvals +* Enabled seamless integration of AI-driven experiences like Fynn, enhancing user engagement and product value + +By leveraging Flutter, Kikoff was able to move quickly in its early stages, scale efficiently as the company grew, and continue innovating with a small but highly effective engineering team. + + diff --git a/sites/www/content/showcase/klasha.md b/sites/www/content/showcase/klasha.md new file mode 100644 index 00000000000..257a548dd9a --- /dev/null +++ b/sites/www/content/showcase/klasha.md @@ -0,0 +1,22 @@ +--- +title: Klasha +description: Fintech startup Klasha uses Flutter to connect Africans to global goods and services, growing to over 300,000 active users. +headline: Klasha +summary: Connecting Africa to the world with Flutter +appName: Klasha +companyName: Klasha +logo: images/third_party/case_studies/klasha/logo.webp +card: images/third_party/case_studies/klasha/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/o8NPZ2ofLbI" +locations: + - Africa +platforms: + - Mobile +industries: + - Banking & Finance +tags: + - mobile +publishDate: 2023-01-25 +--- + +When Klasha founder Jess Anuna needed an app to bring her vision of connecting Africans to global goods and services, she found Flutter. Learn how Flutter helped the young startup grow to more than 300,000 active users, and how it will continue to help the company scale while focusing on what matter most. diff --git a/sites/www/content/showcase/lg-electronics.md b/sites/www/content/showcase/lg-electronics.md new file mode 100644 index 00000000000..0ce8b09f621 --- /dev/null +++ b/sites/www/content/showcase/lg-electronics.md @@ -0,0 +1,23 @@ +--- +title: LG Electronics +description: Learn how LG Electronics is using Flutter to power their next-generation webOS platform for smart TVs and embedded devices. +headline: LG Electronics +summary: Building a next-gen webOS with Flutter +appName: LG Electronics +companyName: LG Electronics +logo: images/third_party/case_studies/lg-electronics/logo.png +card: images/third_party/case_studies/lg-electronics/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/l-J3Of7pLPw" +locations: + - Asia +platforms: + - Web + - Embedded +industries: + - Travel & Lifestyle +tags: + - embedded +publishDate: 2024-12-19 +--- + +Listen to LG Electronics software lead, Donyoung Lee, describe how LG Electronics came to bet on Flutter to power their next-generation webOS platform. diff --git a/sites/www/content/showcase/lotum.md b/sites/www/content/showcase/lotum.md new file mode 100644 index 00000000000..300b10992ce --- /dev/null +++ b/sites/www/content/showcase/lotum.md @@ -0,0 +1,58 @@ +--- +title: Lotum +description: Since 2012, Lotum has developed chart-topping mobile games such as 4 Pics 1 Word, which has been a popular title for over eight years. When Lotum expanded into web-based games, they looked to Flutter to streamline their cross-platform development. +headline: 4 Pics 1 Word +summary: Reaching new users at Lotum with Flutter +appName: 4 Pics 1 Word +companyName: Lotum +logo: images/third_party/case_studies/lotum/logo.webp +card: images/third_party/case_studies/lotum/case_study_card.png +poster: images/third_party/case_studies/lotum/case_study_poster.png +videoEmbedUrl: "https://www.youtube.com/embed/qD0W_JyhNrg" +locations: + - Europe +platforms: + - Mobile +industries: + - Games +successMetrics: + - perc: 99.9 + desc: crash-free + - perc: 0 + desc: reduction in engagement +tags: + - mobile + - android + - ios + - monetization + - games +publishDate: 2021-11-05 +--- + +**Goal** + +Eight years in, [Lotum’s](https://lotum.com/en) flagship game [4 Pics 1 Word](https://play.google.com/store/apps/details?id=de.lotum.whatsinthefoto.us) was in need of a refresh. After more than 450 million downloads worldwide, user numbers were finally starting to show a slight decline. So the team at Lotum decided to rewrite the game for every platform and give 4 Pics 1 Word a tuneup. + +**Why Flutter?** + +For many years, Lotum maintained separate code bases for iOS and Android. But as the team grew, it seemed that half their development time went into troubleshooting cross-platform functionality. Plus, different features exposed different problems on either platform, so development speed was not always aligned. + +When Lotum decided to [expand into web-based games](https://developers.facebook.com/success-stories/lotum/), they took the opportunity to look for a cross-platform development solution. Eventually, the choice came down to either Flutter or a web-based solution involving Vue.js and a custom bridge to native code. Initially, the team decided to try the web-based approach, but they were soon confronted by a lot of limitations and were constantly looking for workarounds. Also, because 4 Pics 1 Word is often downloaded and played offline on low-end devices, the web approach wasn’t a great fit. So after three months, the team switched course and started over with Flutter. + + + +**Their Solution** + +Lotum used Flutter to completely rewrite 4 Pics 1 Word as a cross-platform app. Whereas other cross-platform frameworks either try to emulate native components or translate cross-platform code into their native counterparts, Flutter uses its own rendering engine, Skia, to offer a consistent game layout, look, and feel. This was important to the team, as it would help them achieve the feature parity they felt they had previously lacked. + +***“With the introduction of Flutter, the morale in the team skyrocketed.”*** + +\- Dennis Becker, Head of Development, Lotum + +**Results** + +Based on their previous version launches, Lotum expected to see a temporary drop in daily active users and ad revenue due to instability issues. But when they released the new version of 4 Pics 1 Word, not only did their user engagement numbers remain constant, their vitals actually went up. In fact, Lotum reports that the Flutter version is even more stable than the native counterpart was, with a steady 99.9% crash-free rate. + +And because Lotum uses [Google AdMob](https://admob.google.com/home/) to centralize their ad partner management, they were excited by the seamless integration between Flutter and Google AdMob — especially because 90% of their revenue comes from ads. + +Ultimately, the development team enthusiastically embraced Flutter and plan to continue using it to develop future apps. diff --git a/sites/www/content/showcase/lucid-motors.md b/sites/www/content/showcase/lucid-motors.md new file mode 100644 index 00000000000..c10b436997d --- /dev/null +++ b/sites/www/content/showcase/lucid-motors.md @@ -0,0 +1,40 @@ +--- +title: Lucid Motors +description: American auto manufacturer Lucid Motors designs electric cars that are luxurious, sustainable, and built for all the ways people get around. Efficiency is Lucid’s top priority, so their cars are designed to deliver exceptional range without sacrificing high performance or premium comfort. +headline: Lucid Motors +summary: Small team at Lucid Motors quickly launches a multiplatform app from a single codebase with Flutter +appName: Lucid Motors +companyName: Lucid Motors +logo: images/third_party/case_studies/lucid-motors/logo.png +card: images/third_party/case_studies/lucid-motors/case_study_card.png +poster: images/third_party/case_studies/lucid-motors/case_study_poster.png +locations: + - North America +platforms: + - Mobile +industries: + - Travel & Lifestyle +tags: + - mobile + - android + - ios +publishDate: 2023-11-15 +--- + +**Goal** + +With the launch of their first vehicle, the Lucid Air, the Lucid Motors team needed to quickly develop a companion app for both Android and iOS to serve all their customers. With a team of less than 10 developers, they needed a way to maximize their limited resources without sacrificing the customized UI, intuitive design, or robust feature set their customers deserved. + +**Why Flutter?** + +The team considered using native frameworks to build each app independently, but quickly realized they wouldn’t be able to hit their release date in time. So when a colleague recommended Flutter, Lucid jumped in with both feet. The team combed through the documentation on Flutter.dev to make sure that Flutter met all their needs, including multi-platform coding from a single codebase and easy portability. + +**Their solution** + +The Lucid team found Flutter easy to learn and new UIs quick to implement. They began implementing new features such as remote locking, Google Assistant integration, real-time navigation that syncs with the car, over-the-air vehicle software updates, battery monitoring, and more. + +As they worked, they used the option to build for web to deploy and share internal links to prototype features with the team. This helped them stay on track to meet their ambitious launch goal and share their progress with each other. + +**Results** + +The Lucid team met their launch deadline for both Android and iOS, even with a small team. The team also relied on Flutter's testing features to generate screenshots of their app in different states and in various languages, helping them ensure that they were presenting the best UI for every customer. diff --git a/sites/www/content/showcase/mgm-resorts.md b/sites/www/content/showcase/mgm-resorts.md new file mode 100644 index 00000000000..fd248f3c959 --- /dev/null +++ b/sites/www/content/showcase/mgm-resorts.md @@ -0,0 +1,20 @@ +--- +title: MGM Resorts +description: Learn how MGM Resorts uses Flutter to revolutionize the digital experience for guests across their resorts. +headline: MGM Resorts +summary: Revolutionizing the digital experience for MGM guests with Flutter +appName: MGM Resorts +companyName: MGM Resorts +logo: images/third_party/case_studies/mgm-resorts/logo.png +card: images/third_party/case_studies/mgm-resorts/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/huzVEL676lc" +locations: + - North America +platforms: + - Mobile +industries: + - Travel & Lifestyle +publishDate: 2024-12-19 +--- + +Listen to MGM Resorts partner, Superformula, describe their experience revolutionizing the digital experience for guests across MGM's broad swath of resorts, using Flutter. diff --git a/sites/www/content/showcase/monta.md b/sites/www/content/showcase/monta.md new file mode 100644 index 00000000000..87e41ccf168 --- /dev/null +++ b/sites/www/content/showcase/monta.md @@ -0,0 +1,51 @@ +--- +title: Monta +description: Monta delivers software solutions for the entire EV charging ecosystem, connecting drivers, businesses, and industry partners. With a thoughtfully designed product suite, Monta offers flexibility and transparency, empowering everyone to maintain control over their EV charging experience +headline: Monta +summary: Monta powers platform growth with Flutter +appName: Monta +companyName: Monta +logo: images/third_party/case_studies/monta/logo.webp +card: images/third_party/case_studies/monta/case_study_card.png +poster: images/third_party/case_studies/monta/case_study_poster.png +locations: + - Europe +platforms: + - Mobile + - Web +industries: + - Travel & Lifestyle +tags: + - web +publishDate: 2024-08-05 +--- + +**Goal** + +As a challenger brand in a fast-moving industry, Monta needed a way to quickly launch and iterate on their first mobile app, allowing them to find their product-market fit in as little time as possible. The solution also had to be scalable for future platform growth and ensure the team could maintain quality and consistency across platforms with maximum efficiency. + +**Why Flutter?** + +The team at Monta was familiar with technologies like Firebase Cloud Messaging and the Google Maps Geocoding API. They were also well-versed in Flutter, and saw it as the ideal solution for their mobile needs. Flutter's ability to create custom, visually appealing interfaces that perform smoothly across different devices was a key factor in their decision. After a successful proof of concept confirming smooth integration with Google Maps - a crucial feature for their app - they decided to move ahead. Flutter's cross-platform capabilities allowed them to efficiently create both iOS and Android versions simultaneously. + +**From mobile to web** + +The success of the mobile app led Monta to reconsider their web strategy. They decided to rewrite their existing web application, then called Monta Portal and built with a traditional framework, using Flutter Web. This move was motivated by the opportunity to share resources across platforms and craft a more refined, consistent user experience. The rewrite led to a phased rollout, with the new Flutter version being named Monta Hub. The rewrite was well received by users, and was quickly made the default web app. + +The decision to use Flutter for both mobile and web solidified it as Monta's go-to technology for all user-facing applications, enabling a cohesive look and feel across all platforms while maximizing code reuse and development efficiency. + + + +**Their solution** + +Flutter’s Hot Reload feature made it easy for the Monta team to iterate quickly, allowing for rapid development and testing cycles. They found the documentation on flutter.dev extremely helpful, giving their developers a running start as they learned the new framework. Right away, they started planning for scalability by creating a centralized UI library with custom widgets, UI patterns, theming, assets, and an architecture package that could be shared across teams. + +***“Flutter accelerated our mobile launch and set the foundation for rapid, consistent development across our entire product ecosystem.”*** + +\- Markus Rubey, Head of Flutter, Monta + +**Results** + +Using Flutter, the team launched the first version of the [Monta Charge](https://play.google.com/store/apps/details?id=com.montaapp.monta) mobile app for iOS and Android in just 3 months. The new UI library is also used by multiple development teams for consistency and efficiency across the organization, which has enabled them to fully leverage their frontend engineering talent across multiple platforms and teams, facilitating swift and agile planning and resource allocation. + +As a result all user-facing apps are or will be developed with Flutter, including the migration of existing web apps, like [Monta Hub](https://monta.com/uk/monta-hub/). diff --git a/sites/www/content/showcase/notebooklm.md b/sites/www/content/showcase/notebooklm.md new file mode 100644 index 00000000000..c32273ce8cd --- /dev/null +++ b/sites/www/content/showcase/notebooklm.md @@ -0,0 +1,22 @@ +--- +title: NotebookLM +description: Google's AI-powered research assistant NotebookLM built and shipped a 4.8-star Flutter app in just 7 months. +headline: NotebookLM +summary: How NotebookLM built and shipped a 4.8-Star Flutter App in 7 Months +appName: NotebookLM +companyName: NotebookLM +logo: images/third_party/case_studies/notebooklm/logo.png +card: images/third_party/case_studies/notebooklm/case_study_card.png +poster: images/third_party/case_studies/notebooklm/case_study_poster.png +videoEmbedUrl: "https://www.youtube.com/embed/pMoUg3dkDJk" +locations: + - North America +platforms: + - Mobile +industries: + - Productivity +tags: + - mobile +publishDate: 2025-12-12 +--- + diff --git a/sites/www/content/showcase/nubank.md b/sites/www/content/showcase/nubank.md new file mode 100644 index 00000000000..b76de85f02d --- /dev/null +++ b/sites/www/content/showcase/nubank.md @@ -0,0 +1,74 @@ +--- +title: Nubank +description: After meticulously researching the top cross-platform technologies to help them scale, Nubank chose Flutter to help them launch more features, faster. +headline: Nubank +summary: Scaling with integrity at Nubank with Flutter +companyName: Nubank +logo: images/third_party/case_studies/nubank/logo.jpg +card: images/third_party/case_studies/nubank/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/vnj2i6RNo3g" +locations: + - South America +platforms: + - Mobile +industries: + - Banking & Finance +successMetrics: + - perc: 30 + desc: better merge success rate compared to iOS + - perc: 600 + desc: faster merge rate +tags: + - mobile + - android + - ios +publishDate: 2021-11-05 +--- + +**Goal** + +Nubank is the largest independent digital bank outside of Asia, giving over 48 million people a safe and accessible way to manage their financial lives from the palm of their hand. Using cloud technology and a streamlined UI, their goal is to take the complexity out of banking for everyday people. + +The company has grown extremely rapidly, and they needed a way to develop and ship new products quickly without sacrificing quality. Unfortunately, Nubank struggled to find enough native mobile specialists to keep up with their ambitious pace. As a result, their iOS and Android teams were often lopsided, leading to one platform launching a feature before the other. Besides which, writing every feature twice began to feel like a waste of time. + +Nubank came to the conclusion that specialized teams don’t scale well, and began to look for a way to have single teams developing features end-to-end. With one hybrid platform, backend developers would be able to contribute to the mobile frontend, and products could ship much more quickly. All they needed to do was find the right cross-platform technology for Nubank’s needs. + +**Why Flutter?** + +Nubank [assembled a task force](https://building.nubank.com.br/why-we-think-flutter-will-help-us-scale-mobile-development-at-nubank/) to investigate a few of the most popular hybrid platforms for mobile, including Kotlin Native, React Native, and Flutter. The goal was to find a solution that allowed their teams to work autonomously, developing the mobile app and delivering value on a single architecture, programming language, and set of conventions. + +The task force, made up of Nubank’s most experienced mobile developers, evaluated their options based on 11 major priorities. These included the developer experience, long-term viability of the platform, incremental abstraction cost, non-linear abstraction risk, and the ability for the app to look and feel the same on iOS and Android. + +To do this, they assigned each of the candidate platforms a score in each of these areas through hands-on testing, conversations with specialists, feedback sessions, internal usability testing, and more. + +For the usability tests, the task force watched developers of all levels and backgrounds take a one-hour test. The developers were given a working app, development environment, platform documentation, and a few tasks to code, such as building a “shortcut” button. Then, after the test, they answered a short questionnaire. + +As the task force discovered, developers loved Flutter. Compared to the other options, it offered better hot reload abilities, strong documentation, and a more stable API. And it was just plain fun to use. So with their research complete, the task force published a [54-page report](https://cdn.nubank.com.br/mobile/taskforce/nubank-mobile-architecture-task-force-mission-report.pdf) naming their recommended platform: Flutter. + + + +**Their Solution** + +The choice was clear. Flutter shone in almost every category, outperforming other platforms in terms of developer experience, documentation, API stability, lack of platform specialization, and more. The team also [loved Flutter’s testing capabilities](https://www.youtube.com/watch?v=vnj2i6RNo3g), especially the built-in testing infrastructure for unit, integration, and end-to-end tests without the need for rendering to the screen. + +With their decision made, Flutter became Nubank’s go-to solution for mobile development. Since then, all new features have been written in Flutter, with legacy features migrated over time. + +***“Flutter had everything we needed right out of the box: good documentation on how to integrate our app, and a hot reload that really works, support from the community, and tooling.”*** + +\- Igor Borges, Software Engineer, Nubank + +***“Having Flutter as our main technology has significantly reduced the barrier, allowing new engineers to be able to contribute to our app within days after being onboarded.”*** + +\- Noe Branagan, Engineering Manager, Nubank + +**Results** + +Flutter has been a [game-changer for Nubank](https://building.nubank.com.br/scaling-with-flutter/), allowing them to continue to scale without sacrificing quality. Many of their engineers have been able to transition to full-stack, increasing developer productivity and enjoyment at the same time. And because the Flutter onboarding process is so simple, new engineers are able to contribute to the app within days of being onboarded. Even non-mobile engineers can become productive in just a few weeks. + +Their build time has also improved dramatically. Using Flutter, Nubank launched a new life insurance feature in just three months — their fastest launch ever. Previously, developing and launching a new product would take them anywhere from several months to an entire year. To speed up development even more, Nubank also adopted an experimental internal developer tool using Flutter Desktop that reduces laptop battery usage by skipping emulators. It also helps with quick testing in different device dimensions. + +In fact, Flutter has led to performance improvements across the board. With Flutter, Nubank’s merge success rate is 30% better than it was with native platforms. On average, Flutter pull requests take just 9.9 minutes to merge, compared to an average of 70.45 minutes on all platforms. Flutter has also given Nubank more insights, like the ability to measure app size by feature of package, and correlate metrics with other systems. + +It also provides more UI consistency. Using native tools, Nubank used to have multiple and inconsistent component libraries. Now, they have their own design system, which product teams can extend and customize. They also created a tool to dynamically deliver new content to their app, allowing them to localize content without releasing a new version of the app. + +At Nubank, Flutter is now a part of the culture for good. diff --git a/sites/www/content/showcase/onrizon-games.md b/sites/www/content/showcase/onrizon-games.md new file mode 100644 index 00000000000..008b284e848 --- /dev/null +++ b/sites/www/content/showcase/onrizon-games.md @@ -0,0 +1,58 @@ +--- +title: Onrizon Games +description: Onrizon is an online game studio that specializes in free, casual games that are easy to play, easy to learn, and accessible to everyone on web and mobile. +headline: Onrizon Social Games +summary: Onrizon doubles earnings and improves app rating with Flutter +appName: Onrizon Social Games +companyName: Onrizon Social Games +logo: images/third_party/case_studies/onrizon-games/logo.png +card: images/third_party/case_studies/onrizon-games/logo.png +poster: images/third_party/case_studies/onrizon-games/case_study_poster.png +locations: + - South America +platforms: + - Mobile +industries: + - Games +successMetrics: + - perc: 100 + desc: increase in ad earnings +tags: + - android + - ios + - monetization + - games +publishDate: 2023-11-15 +--- + +**Goal** + +Many of the games in Onrizon’s portfolio were originally built in HTML5 and designed for browser-based play. As mobile gaming took off, the team migrated several titles to mobile with a cross-platform framework, but the user experience wasn’t as smooth as they hoped it would be and they knew they needed to invest in another solution. + +**Why Flutter?** + +Once the Onrizon team found themselves spending more time troubleshooting their existing apps than developing new ones, they decided it was time to migrate. + +They decided to start with one of their most popular games, [StopotS](https://play.google.com/store/apps/details?id=com.gartic.StopotS&hl=en&gl=US). The team experimented with a few cross-platform frameworks, but found many didn’t offer enough customization for their game’s UI. The team then decided to build a few prototypes with Flutter to see if they could achieve the quality they wanted. + +As developers with backgrounds in web technologies like JavaScript and React, they were initially skeptical about learning a new language. However, they both found Dart was easy to learn, especially with the documentation on flutter.dev and the support of Google and the Flutter community. They decided to move ahead with Flutter for the relaunch of StopotS. + + + +**Their solution** + +The team began rewriting StopotS with Flutter, leaning on the many ready-to-use widgets to get started quickly. Resources like animations and page transitions are supported out of the box, without a need for third-party packages, allowing Onrizon to focus on the truly unique elements of their game. + +As a game, StopotS isn’t limited to following system UI patterns, so it was important to them to have the same look and feel on different platforms. The single codebase sped up the development process and helped them guarantee the same quality on both iOS and Android. + +Flutter also made it much easier to upgrade versions or add packages, which had been a real challenge in the past. With Flutter, they no longer have to rely on outdated SDKs supported by third-party packages, but can use first-party packages like the [Google Mobile Ads Flutter plugin](https://pub.dev/packages/google_mobile_ads) and the latest SDKs to help them monetize their game. + +*“If you're a web developer, don't be afraid to learn Dart. It's a great language with the perfect synergy for building apps. As JavaScript developers, it was quite familiar and easy to learn.”* + +\- HENRIQUE MOREIRA, CEO, Onrizon + +**Results** + +Using Firebase to measure their performance, they discovered that their earnings from banner and interstitial ads increased by over 100% from the previous version. Their user rating also improved, from an average of 4.28 to 4.58, all within one year + +Based on this success, Onrizon has begun to migrate the rest of their game catalogue to Flutter starting with [Gartic.io](https://gartic.io/), a popular drawing and guessing game, which saw many of the same benefits as StopotS. The team intends to build any future games in Flutter from the start. diff --git a/sites/www/content/showcase/patchme-eye-patch-tracking.md b/sites/www/content/showcase/patchme-eye-patch-tracking.md new file mode 100644 index 00000000000..26b8937829a --- /dev/null +++ b/sites/www/content/showcase/patchme-eye-patch-tracking.md @@ -0,0 +1,21 @@ +--- +title: 'PatchMe: Eye Patch Tracking' +description: When a couple from Boise, Idaho learned that they would need to start patching their daughter’s eyes, they took it upon themselves to learn Flutter and build an app that put control back in their hands. Watch the video above to learn their story. +headline: 'Patch Me: Eye Patch Tracking' +summary: Taking back control with Flutter +companyName: 'PatchMe: Eye Patch Tracking' +logo: images/third_party/case_studies/patchme-eye-patch-tracking/logo.webp +card: images/third_party/case_studies/patchme-eye-patch-tracking/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/qnofZc6Pn3Y" +locations: + - North America +platforms: + - Mobile +industries: + - Health +tags: + - developer-story +publishDate: 2021-11-05 +--- + +When a couple from Boise, Idaho learned that they would need to start patching their daughter’s eyes, they took it upon themselves to learn Flutter and build an app that put control back in their hands. Watch the video above to learn their story. diff --git a/sites/www/content/showcase/pubg-mobile.md b/sites/www/content/showcase/pubg-mobile.md new file mode 100644 index 00000000000..12c86449c6a --- /dev/null +++ b/sites/www/content/showcase/pubg-mobile.md @@ -0,0 +1,25 @@ +--- +title: PUBG MOBILE +description: PUBG MOBILE turned to Flutter to add a community module to the game, connecting over 1 billion players worldwide. +headline: PUBG MOBILE +summary: Connecting 1 billion players with Flutter +appName: PUBG MOBILE +companyName: Tencent +logo: images/third_party/case_studies/pubg-mobile/logo.jpg +card: images/third_party/case_studies/pubg-mobile/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/03ETVuWZiBc" +locations: + - Asia +platforms: + - Mobile +industries: + - Games +tags: + - mobile + - android + - ios + - games +publishDate: 2023-01-25 +--- + +When the PUBG MOBILE team wanted to add a community module to allow players from all over the world to share gameplay clips and more, they turned to Flutter. Watch the video to learn why. diff --git a/sites/www/content/showcase/push.md b/sites/www/content/showcase/push.md new file mode 100644 index 00000000000..6dc2e610662 --- /dev/null +++ b/sites/www/content/showcase/push.md @@ -0,0 +1,28 @@ +--- +title: Push +description: When the small team at Push began to receive requests for an Android app, they were worried about their ability to support multiple platforms - that is until the team found Flutter. Watch the video to learn more about how the team is using Flutter to help athletes all over the world achieve their dreams. +headline: Push +summary: Optimizing Athletic Training with Flutter +companyName: Push +logo: images/third_party/case_studies/push/logo.webp +card: images/third_party/case_studies/push/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/0LqTlDXtzg4" +locations: + - Europe +platforms: + - Mobile +industries: + - Health +successMetrics: + - perc: 20 + desc: reduction in maintenance effort + - perc: 100 + desc: feature parity +tags: + - mobile + - android + - ios +publishDate: 2021-11-05 +--- + +When the small team at Push began to receive requests for an Android app, they were worried about their ability to support multiple platforms - that is until the team found Flutter. Watch the video to learn more about how the team is using Flutter to help athletes all over the world achieve their dreams. diff --git a/sites/www/content/showcase/quintoandar.md b/sites/www/content/showcase/quintoandar.md new file mode 100644 index 00000000000..4039b32fe8f --- /dev/null +++ b/sites/www/content/showcase/quintoandar.md @@ -0,0 +1,62 @@ +--- +title: QuintoAndar +description: As the company scaled, QuintoAndar turned to Flutter to bring their mobile apps up to speed with their web experience. +headline: QuintoAndar +summary: Achieving feature parity at QuintoAndar with Flutter +companyName: QuintoAndar +logo: images/third_party/case_studies/quintoandar/logo.png +card: images/third_party/case_studies/quintoandar/case_study_card.png +poster: images/third_party/case_studies/quintoandar/case_study_poster.png +locations: + - South America +platforms: + - Mobile +industries: + - Banking & Finance + - Travel & Lifestyle +successMetrics: + - perc: 14 + desc: >- + (3.8⭐️ to 4.5⭐️) + + increase in Play Store store rating +tags: + - mobile + - android + - ios +publishDate: 2021-11-05 +--- + +**Goal** + +Since 2012, Brazilian real estate marketplace [QuintoAndar](https://www.quintoandar.com.br/) has connected thousands of renters and landlords through its web, [Android](https://play.google.com/store/apps/details?id=br.com.quintoandar.inquilinos), and [iOS](https://apps.apple.com/us/app/quintoandar-im%C3%B3veis/id1109011232) platforms. But as the company grew, its apps began to diverge, with unbalanced teams threatening an imbalance between the apps, too. + +Because 90% of their users accessed the site via web, QuintoAndar’s mobile apps originally took a backseat in terms of priority. In fact, the Android app was basically just a portal to the web version — using [Trusted Web Activity](https://developer.chrome.com/docs/android/trusted-web-activity/) (TWA), they were able to quickly and easily get an app on the Play Store with just the small team they had at the time. But as they grew, users starting asking for a more robust mobile experience. When 27% of their Android reviews mentioned the need for a true mobile app, the team knew it was time to make a change. + +The mobile teams were also extremely understaffed compared to the web team. While there were 30 project teams assigned to the web version, only one team was assigned to iOS. With that kind of disparity, there was just no way for the mobile apps to work at the same rate as the web app. + +And finally, QuintoAndar worried that the developers on the mobile teams would be permanently playing catch-up. At QuintoAndar, teams are given the freedom to experiment and find new solutions, but they worried that their mobile teams would become execution-only as they scrambled to implement the web team’s new features. + +What they needed was a way for all their developers to work collectively, solving problems and building features for all three platforms at once, without relegating one team to continuously playing catch-up. What they needed, in other words, was Flutter. + +**Why Flutter?** + +Before making a decision, QuintoAndar did some research to find out what other companies were doing. They noticed that most were using either React Native or Flutter, so the team decided to develop a proof of concept with each of the top two technologies. + +As a test, they built out a set of features in both React Native and Flutter, then compared them in terms of perfomance, modularization, ease of learning, look and feel, and several other metrics. Although the team had expected React Native to be a better fit for their needs, Flutter emerged the clear winner, and they decided to move forward with it right away. + + + +**Their Solution** + +Their first project was to develop a new Android app in Flutter with the same native look and feel. To see how the new Flutter version compared to the original TWA version, they used a [staged roll-out](https://support.google.com/googleplay/android-developer/answer/6346149) and monitored the results with a tool called [appbot](https://appbot.co/). After they had released the Flutter version to 50% of their user base, the results were clear — the ratings and reviews for the Flutter version were noticeably more positive than before, which gave QuintoAndar the confidence to roll out the new app to their entire user base. + +***"Flutter let us keep our culture of autonomous teams with ownership of the features they deliver throughout the product development process, while delivering a great experience to our mobile users."*** + +\- Augusto Souza, Senior Software Engineering Manager, QuintoAndar + +**Results** + +Sure enough, once they released the Flutter version to everyone, [QuintoAndar’s ratings improved dramatically](https://medium.com/quintoandar-tech-blog/why-flutter-will-help-scale-quintoandars-mobile-presence-ab8888bf1c58). Within five months, their Play Store rating increased from 3.8 to 4.5, where it has stayed ever since. + +Meanwhile, QuintoAndar has gone all-in on Flutter, investing in training more than 35 new Flutter developers, creating an internal training course, and even launching a mentorship program. New developers are given hands-on learning opportunities that provide real value to the company, under the supervision of a more experience Flutter developer. Flutter has given all developers at QuintoAndar the opportunity to take initiative and solve problems for their customers, no matter what platform they might be on. diff --git a/sites/www/content/showcase/reflectionapp.md b/sites/www/content/showcase/reflectionapp.md new file mode 100644 index 00000000000..a42cf584eea --- /dev/null +++ b/sites/www/content/showcase/reflectionapp.md @@ -0,0 +1,55 @@ +--- +title: Reflection.app +description: Reflection.app helps users start a meaningful reflection practice and guides their personal growth each month with apps for iOS, Android, macOS, and web. To help the business scale across platforms with a small development team, the company turned to Flutter. +headline: Reflection.app +summary: Reflection.app scales their business with Flutter +appName: Reflection.app +companyName: Reflection.app +logo: images/third_party/case_studies/reflectionapp/logo.png +card: images/third_party/case_studies/reflectionapp/case_study_card.png +poster: images/third_party/case_studies/reflectionapp/case_study_poster.png +locations: + - North America +platforms: + - Mobile + - Web + - Desktop +industries: + - Health +tags: + - android + - ios + - web + - macos +publishDate: 2022-10-10 +--- + +**Goal** + +Originally a web-only experience, [Reflection.app](https://www.reflection.app/) supports thousands of active users. However, the team soon discovered that their most loyal users wanted a dedicated mobile app, not just a mobile web interface. So with only two full-time developers, the team needed to quickly publish and maintain an elegant and scalable app on [iOS](https://www.reflection.app/ios-appstore), [Android](https://www.reflection.app/android-appstore), and [web](https://www.reflection.app/journal) on a limited budget. + +**Why Flutter?** + +Reflection.app initially launched as a web-only Javascript app because the team was told it would be easier and faster to launch a prototype on the web than on mobile. While that MVP was in development, a colleague encouraged them to check out Flutter. + +The promise of a true multi-platform single codebase piqued their interest, and they joined a Discord chat group where they met a Flutter expert who helped them understand how Flutter could work for Reflection.app. After hiring him as their lead mobile developer, they retrained their existing developer in Flutter within a few months. + + + +**Their solution** + +The Flutter framework gave Reflection.app the scaffolding they needed and enough plug-and-play widgets to bring an MVP to life in weeks. As the team experimented with the new platform, they learned to lean on the Flutter community. When they hit a roadblock building their web and Mac apps, they reached out to the Flutter team on Twitter, where an expert gave them helpful suggestions that allowed them to work around some of their challenges. + +***“What we have built would never have been possible without Flutter. Flutter's single code base made it possible for us to build our cross-platform application with a remarkably small team, and deploy it in record time.”*** + +***- David Radparvar, co-founder, Reflection.app*** + +**Results** + +Instead of splitting their developer resources between platforms, Reflection.app was able to focus their efforts on a single codebase, doubling their development and deployment speed. Flutter's single codebase made it possible for them to build a cross-platform application with a remarkably small team and deploy it in record time. + +Soon after launching the dedicated mobile apps with Flutter, mobile engagement outpaced web by 2x, while the number of monthly journal entries increased by 5x. + +Since then, Reflection.app has been recognized by Apple and was accepted into Apple's “Foundations Accelerator,” a program for promising new apps. + +Next, the team is exploring ways to use Google ML to provide richer sentiment analysis and personalized insights into their quickly growing user base. diff --git a/sites/www/content/showcase/reflectly.md b/sites/www/content/showcase/reflectly.md new file mode 100644 index 00000000000..13d61ca2eeb --- /dev/null +++ b/sites/www/content/showcase/reflectly.md @@ -0,0 +1,29 @@ +--- +title: Reflectly +description: Despite having just two engineers, the Reflectly team was able to deliver both an iOS and Android app in just 2.5 months. Watch the video above to learn more about how the team accomplished this feat. +headline: Reflectly +summary: Reflectly designs unique digital experiences with Flutter +companyName: Reflectly +logo: images/third_party/case_studies/reflectly/logo.webp +card: images/third_party/case_studies/reflectly/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/6ZpETbJjipQ" +locations: + - Europe +platforms: + - Mobile +industries: + - Health + - Travel & Lifestyle +successMetrics: + - perc: 50 + desc: decrease in development time + - perc: 10 + desc: growth in monthly active users +tags: + - mobile + - android + - ios +publishDate: 2021-11-05 +--- + +Despite having just two engineers, the Reflectly team was able to deliver both an iOS and Android app in just 2.5 months. Watch the video above to learn more about how the team accomplished this feat. diff --git a/sites/www/content/showcase/rive.md b/sites/www/content/showcase/rive.md new file mode 100644 index 00000000000..eb484df8ad6 --- /dev/null +++ b/sites/www/content/showcase/rive.md @@ -0,0 +1,48 @@ +--- +title: Rive +description: Rive rewrote their powerful animation tool entirely in Flutter to enable developers to create beautiful, multi-platform illustrations. +headline: Rive +summary: Rive rewrote their powerful animation tool entirely in Flutter to enable developers to create beautiful, multi-platform illustrations. +companyName: Rive +logo: images/third_party/case_studies/rive/logo.png +card: images/third_party/case_studies/rive/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/eODLolzspwY" +locations: + - North America +platforms: + - Web + - Desktop +industries: + - Productivity +tags: + - web +publishDate: 2021-11-05 +--- + +**Goal** + +[Rive](https://rive.app/) allows developers to create and ship beautiful, interactive animations to any platform. Their open-source runtimes make it possible for creators to animate once, then launch on any platform they want. + +However, this wasn’t always the case. In the beginning, the team spent a lot of their time managing the development cycle: maintaining different client-side web packages for a lot of the UI functionality, a custom build process, custom dev ops, custom testing, linting, language servers, and more — all from separate packages that needed maintenance and constant updating. + +Instead, the team wanted a framework that encompassed all of these things, ensuring compatibility across these aspects of the workflow so they could focus more on development and less on maintenance. And in order to support their robust user interface with glitch-free animations in real-time, Rive needed a tool that could handle heavy graphics rendering across multiple browsers and platforms. That’s when they turned to Flutter. + +**Why Flutter?** + +The first version of Rive was written entirely with JavaScript ES5 and DOM, which worked great for web, but not much else. So next they tried React with ES6. They used webpack and an early version of CanvasKit, but it was a significant effort to maintain all the different platforms. + +Around the same time, Rive was working with the Flutter team on the Flutter Interact event. The more they learned about Flutter, the better fit it sounded like for Rive. It offered a cohesive platform with excellent tooling, a strongly typed programming language, and strong language analysis tools including a standardized formatter, built-in linting, language servers for popular editing environments, and the ability to test directly from editing environments. + +**Their solution** + +The team decided to give Flutter a shot. They built a prototype with Canvaskit in Flutter, and immediately noticed an improvement. In addition to offering a true multi-platform solution, it also became much easier to onboard new engineers. They also really liked the built-in testing capabilities, which made it much easier to maintain the quality and stability of the app. + +**Results** + +Rive launched their editor built entirely in Flutter. Their codebase is now much easier to maintain, and allows engineers to onboard and start writing code immediately. + +They’ve also found that it’s very easy to add custom pieces in Flutter. Feature-building is easier and more fun, and designers are much better able to tinker and build out prototypes. This has allowed them to develop much richer experiences in Rive, including animations, interactive graphics, and fluid and reactive layouts. + +The general stability of the app has improved, too. Thanks to the built-in testing features, they now run thousands of tests per build, which has given them the confidence to move to a daily release cycle. + +Based on their success, the team is now working on launching a desktop application for MacOS. For this release, the team says they don’t even have to do much customization, as the abstraction has already been done.They’ve also found that it’s very easy to add custom pieces in Flutter. Feature-building is easier and more fun, and designers are much better able to tinker and build out prototypes. This has allowed them to develop much richer experiences in Rive, including animations, interactive graphics, and fluid and reactive layouts. diff --git a/sites/www/content/showcase/robert-felker.md b/sites/www/content/showcase/robert-felker.md new file mode 100644 index 00000000000..0824aa95c1d --- /dev/null +++ b/sites/www/content/showcase/robert-felker.md @@ -0,0 +1,22 @@ +--- +title: Robert Felker +description: Robert Felker is pushing the limits of creativity with Flutter. He is a developer who uses Flutter to create uniquely designed generative art. Learn how Flutter helped open the doors to his artistic creativity. +headline: 'Robert Felker: Generative Art' +summary: Pushing artistic and technological boundaries with Flutter +companyName: Robert Felker +logo: images/third_party/case_studies/robert-felker/logo.png +card: images/third_party/case_studies/robert-felker/logo.png +videoEmbedUrl: "https://www.youtube.com/embed/DEppSs_ko48" +locations: + - North America +platforms: + - Mobile + - Web +industries: + - Travel & Lifestyle +tags: + - developer-story +publishDate: 2021-11-05 +--- + +Robert Felker is pushing the limits of creativity with Flutter. He is a developer who uses Flutter to create uniquely designed generative art. Learn how Flutter helped open the doors to his artistic creativity. diff --git a/sites/www/content/showcase/romwe-fashion-shein.md b/sites/www/content/showcase/romwe-fashion-shein.md new file mode 100644 index 00000000000..ffc2a21592e --- /dev/null +++ b/sites/www/content/showcase/romwe-fashion-shein.md @@ -0,0 +1,49 @@ +--- +title: Romwe Fashion (SHEIN) +description: ROMWE is an online fashion retailer in the Shein family of brands. They specialize in affordable, fashion-forward ensembles for young people across the world. +headline: Romwe Fashion +summary: ROMWE improves developer efficiency by 30% with Flutter +appName: Romwe Fashion +companyName: SHEIN +logo: images/third_party/case_studies/romwe-fashion-shein/logo.png +card: images/third_party/case_studies/romwe-fashion-shein/logo.png +poster: images/third_party/case_studies/romwe-fashion-shein/case_study_poster.png +locations: + - Asia +platforms: + - Mobile + - Web + - Desktop +industries: + - Travel & Lifestyle +successMetrics: + - perc: 30 + desc: increased developer efficiency +tags: + - mobile + - android + - desktop +publishDate: 2023-11-15 +--- + +**Goal** + +The fashion industry moves fast, and ROMWE, A Shein company needed to make sure its app could keep up. When the team decided to update their mobile app to improve the user experience, they knew it was important that the solution they chose would allow them to make future changes as quickly and efficiently as possible. + +**Why Flutter?** + +With apps for iOS, Android, web, and macOS, cross-platform support was an absolute necessity. After considering other frameworks, the team at ROMWE discovered Flutter in July 2019, and was immediately interested in its multi platform coding ability. After reading the documentation on flutter.dev, the team built a proof of concept to evaluate the platform. The proof of concept was meant to test a variety of factors, including development efficiency, performance, UI performance, and code push. The most important factors, though, were performance and development efficiency, for which Flutter quickly impressed, along with its flexibility and ease of use. After that, Flutter became the easy choice. + + + +**Their solution** + +The team found Flutter easy to learn and get started with right away. As they began to build the new ROMWE app, they appreciated the ability to code all four apps from a single codebase. After launch, the team used Firebase to analyze the app’s performance, including user behavior. + +*“Flutter is a framework with high development efficiency and has performance like native application. It provides rich set of UI components and is very suitable for developing new applications. One set of code can be reused across multiple platforms”* + +\- Wei Li, Development Team Leader, ROMWE + +**Results** + +By using Flutter, ROMWE’s development efficiency increased by about 30%. Based on their success, they plan to continue using Flutter for their future app development needs. diff --git a/sites/www/content/showcase/rows.md b/sites/www/content/showcase/rows.md new file mode 100644 index 00000000000..ed13e061678 --- /dev/null +++ b/sites/www/content/showcase/rows.md @@ -0,0 +1,23 @@ +--- +title: Rows +description: Learn how next-generation spreadsheet Rows uses Flutter to bring their collaborative vision to users on every platform. +headline: Rows +summary: Creating the future of spreadsheets with Flutter +appName: Rows +companyName: Rows +logo: images/third_party/case_studies/rows/logo.png +card: images/third_party/case_studies/rows/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/OEdQXBUPYOE" +locations: + - North America +platforms: + - Desktop +industries: + - Productivity +tags: + - desktop + - windows +publishDate: 2022-04-06 +--- + +Rows is a next generation spreadsheet focusing on performance and collaboration. Watch the video to learn how Flutter is helping them bring their beautiful vision to users on every platform. diff --git a/sites/www/content/showcase/samlabs.md b/sites/www/content/showcase/samlabs.md new file mode 100644 index 00000000000..d6b660389ce --- /dev/null +++ b/sites/www/content/showcase/samlabs.md @@ -0,0 +1,56 @@ +--- +title: iRobot +description: When iRobot Education wanted to reach more users with its iRobot Coding App, they turned to Flutter for a cross-platform solution that could be managed by a small team. +headline: Sam Labs +summary: Sam Labs Uses Flutter to Expand Access to Coding +appName: iRobot Coding +companyName: Sam Labs +logo: images/third_party/case_studies/samlabs/logo.webp +card: images/third_party/case_studies/samlabs/case_study_card.png +poster: images/third_party/case_studies/samlabs/case_study_poster.png +locations: + - North America +platforms: + - Mobile + - Web +industries: + - Productivity + - Education +successMetrics: + - perc: 300 + desc: increase in monthly active users + - perc: 400 + desc: productivity increase +tags: + - mobile + - android + - ios + - tablet +publishDate: 2021-11-05 +--- + +**Goal** + +Although best known for its Roomba® Robot Vacuums, [iRobot](https://www.irobot.com/) also creates programmable robots that teach coding skills in a fun, hands-on way. Developed by the iRobot Education division, the [iRobot Coding App](https://play.google.com/store/apps/details?id=com.rootrobotics.rootcoding) lets coders of all skill levels control a virtual robot — or, with the companion Root® coding robot, a real-life one. + +However, because the App was originally developed in Swift, it was only available for iOS devices. To make STEM education available to a broader and more diverse audience, iRobot Education wanted to release Android and web versions of the App as well. That meant finding a cross-platform solution that was easy enough to be managed by a small team, but powerful enough to support high-quality performance and user experience. + +**Why Flutter?** + +The team chose Flutter because it offered a single codebase, a modern language, and an advanced graphics framework to support the App’s highly visual and interactive experience. Plus, the scope was manageable without requiring an enormous amount of resources. + +Because the team was already familiar with Google’s [Firebase](https://firebase.google.com/) cloud platform, they felt confident that the Flutter documentation would be similarly helpful and easy to use, which also played a role in their decision. + + + +**Their Solution** + +Within weeks, the team was writing production code with Flutter and—in a fraction of the time it had taken to write the original iOS app—they released a multiplatform version of the [iRobot Coding App](https://root.samlabs.com/) on Android, iOS, and web. This was all the more impressive considering most of the team had never used Flutter or Dart before. + +***“With Flutter, we’re able to accomplish with one or two developers what would take other teams 10-20 people to pull off!”*** + +-Julián da Silva Gillig, Lead Software Developer, iRobot Education + +**Results** + +Since launching with Flutter, the iRobot Coding App has expanded to 170 countries and three major platforms, quadrupling the number of monthly active users. Because the App is now much easier to maintain, the team has been able to focus on rolling out new features across all three platforms, including an ambitious new 3D simulator environment. The iRobot Education engineering team now includes 2 full-time Flutter developers to help them maintain and develop new features for the future. diff --git a/sites/www/content/showcase/skandia.md b/sites/www/content/showcase/skandia.md new file mode 100644 index 00000000000..59fd7e05792 --- /dev/null +++ b/sites/www/content/showcase/skandia.md @@ -0,0 +1,64 @@ +--- +title: Skandia +description: Swedish financial services company Skandia offers banking products, mortgages, investment options, pensions, and insurance products to support their customers' long-term financial goals. +headline: Skandia +summary: Skandia improves their mobile app quality with Flutter +appName: Skandia +companyName: Skandia +logo: images/third_party/case_studies/skandia/logo.png +card: images/third_party/case_studies/skandia/case_study_card.png +poster: images/third_party/case_studies/skandia/case_study_poster.png +locations: + - Europe +platforms: + - Mobile +industries: + - Banking & Finance +tags: + - mobile + - android + - ios +publishDate: 2023-03-21 +--- + +In 2020, Skandia re-evaluated their digital strategy and noticed that their mobile banking app was in need of a refresh. It had started to fall behind their competitors in terms of functionality and performance, and the feature gap between their own Android and iOS apps had begun to widen. + +Fixing these differences while adding and improving existing features became increasingly difficult for the seven-person developer team, largely due to an outdated, non-scalable codebase. + +The team realized that the only solution was to rewrite the app from scratch, but they weren’t sure whether to opt for a complete native implementation per platform, go for a hybrid approach, or search for a cross-platform solution. + +**Why Flutter?** + +The team evaluated several options, including continuing to use native applications. However, they also saw an opportunity to try new and more innovative solutions by looking at cross-platform frameworks. + +One of those potential frameworks was React Native, as Skandia already had several web developers on staff. But while it would have initially saved them money by avoiding a full-fledged app team, they realized that the costs would outweigh the benefits before getting so far as a prototype. + +Skandia also considered an embedded web approach, since they were already comfortable building micro-websites for specific use cases. But this approach wouldn’t scale well or work well with native functionality, and the team wanted a better mobile UX/UI experience than it could provide. + +Finally, one of Skandia’s developers, who had built several personal projects in Flutter, suggested it as a potential solution to the technical team. After building a proof of concept, Flutter checked all the team’s boxes. It would help them ensure parity between platforms, offers great performance by compiling into native code, and would allow the team to scale features and functionality with ease. Skandia also appreciated the robust Flutter community and availability of support, and so decided to move forward with Flutter. + + + +**Their solution** + +While the migration meant retraining and adding a few new Flutter engineers, the hiring and onboarding process was easier than they expected. Most of the team today consists of developers from non-Flutter professional backgrounds, including web, backend, and native mobile devs. + +After a short onboarding period, Skandia reported that the team was delighted about the change. The rare issues they encounter are quickly resolved in-house, often with the help of the Flutter community. + +Thanks to Flutter’s portability, the team made their app available internally as a desktop application for general development work, carrying over 90% of all features and functionality from the mobile app. (The other 10% are platform-specific features that have to be performed on physical devices.) Skandia uses the desktop app on a daily basis to implement design and technical changes, making their development flow much more efficient than before. + +*“Developer happiness increased tremendously, from pulling our hair out trying to implement new features to pure joy.”* + +\- Johannes Löhnn, App Architect, Skandia + +**Results** + +After a few months, Skandia released updated versions of their Android and iOS apps with Flutter. + +Even navigating a new platform, the team’s development speed increased dramatically. Thanks in part to Flutter’s hot reload feature, the team reports that they are able to iterate as fast as their UI/UX developers when it comes to improving design and functionality, while still closing their required tickets in time. It also improved Skandia’s time to market by several months. + +Internally, developer satisfaction increased tremendously. The Skandia team was very happy with the change and appreciated having access to the repository of open-source packages for Flutter and Dart at pub.dev. + +Flutter helped Skandia catch up to their competitors in terms of mobile quality standards, enabling them to optimize their UX by accelerating the upstart and dynamically loading the content. All of these benefits helped Skandia offer their customers a great experience, and gave the team the ability to handle bottlenecks on the backend more easily. + +Migrating to Flutter also had an unexpected financial benefit: the team now requires fewer consultants. Instead, they employ a small, fast, and flexible team with a shared knowledge base. diff --git a/sites/www/content/showcase/sncf-connect.md b/sites/www/content/showcase/sncf-connect.md new file mode 100644 index 00000000000..2de1ea5b77b --- /dev/null +++ b/sites/www/content/showcase/sncf-connect.md @@ -0,0 +1,47 @@ +--- +title: SNCF Connect +description: SNCF Connect is the all-in-one mobility service, designed and developed by SNCF Connect & Tech. With more than 1.3 billion visits in 2023, SNCF Connect enables travelers to manage their journeys end to end, including buying tickets, searching itineraries, or checking traffic information in France. +headline: SNCF Connect +summary: SNCF Connect prepares for French summer sports events with Flutter +appName: SNCF Connect +companyName: SNCF Connect +logo: images/third_party/case_studies/sncf-connect/logo.png +card: images/third_party/case_studies/sncf-connect/case_study_card.png +poster: images/third_party/case_studies/sncf-connect/case_study_poster.png +locations: + - Europe +platforms: + - Mobile +industries: + - Travel & Lifestyle +tags: + - android + - ios +publishDate: 2024-08-05 +--- + +**Goal** + +For years, the SNCF Connect apps for iOS and Android helped over 15 million people make better, more seamless journeys across France. But in August 2020, the team behind the influential app undertook a one year-long challenge to update their tech stack to a state-of-the-art solution that supported declarative UI, and simultaneous updates to iOS and Android. + +**Why Flutter?** + +Because so many people rely on SNCF Connect to get around, the team couldn’t take any migration decision lightly. Both the iOS and Android versions had been downloaded over 15 million times, so any interruption to their service would have a major impact. As a result, the team considered all their options carefully, testing and building proofs of concepts with several frameworks. Then, they compared the time to build, the quantity of code mutualized, the learning curve, features, performance, tooling, and overall developer experience of each platform. In the end, they chose Flutter for its multiplatform support and development speed, which would help them decrease their time to market. + + + +**Their solution** + +To help their developers get up to speed, SNCF Connect & Tech invited a Flutter expert to train the team on-site. Many of their mobile developers, including several who had been writing native code for a decade or more, took to Flutter right away. Within a few days, everyone was creating working widgets and screens, and even the more reluctant team members were sold on Flutter. One of the most persuasive features was Hot Reload, which allowed them to immediately see the results of their changes and iterate more quickly. + +***“With Flutter, Wallet, and NFC combined, it is now possible to use a single app to travel in France by train and bus, rent a car, book a hotel, use city transport in venues like Paris, Bordeaux, or Chateauroux, store tickets in the Google Wallet, chat with a bot and switch to customer support in the same in-app conversation.”*** + +\- François Nollen, Staff Engineer, SNCF Connect & Tech + +**Results** + +The new and improved SNCF Connect app launched on time. As a result, 90% of mobile code is cross-platform, the team makes one major release every week with no delay between iOS and Android features, and spends less time monitoring multiple stacks. SNCF Connect & Tech has even found that it’s easier to hire developers, as many candidates are eager to work with Flutter. + +More recently, the team, expecting millions of people to use France’s railways and the app to travel to various destinations - including millions of first-time visitors - provided several updates to the app in preparation for the sports competitions this summer in Paris. Those improvements encompass general accessibility, new features, and partnerships, and bring the app to 150 screens making it the biggest Flutter app in Europe. + +When they’re not iterating on the SNCF Connect app, the team regularly releases open-source plugins such as their [Google Wallet plugin](https://pub.dev/packages/flutter_google_wallet) or the recent [Flutter Eco Mode plugin](https://pub.dev/packages/flutter_eco_mode), which helps developers implement a custom eco-friendly mode in their mobile app. They’re also passionate Flutter ambassadors, regularly sharing what they’ve learned [at conferences](https://www.youtube.com/watch?v=mKerYStzfIw), [on Medium](https://abody.medium.com/accessibility-in-flutter-tips-for-a-more-inclusive-app-3e8406e9356d), and many local meetup events. diff --git a/sites/www/content/showcase/so-vegan.md b/sites/www/content/showcase/so-vegan.md new file mode 100644 index 00000000000..f6aaf0efa8e --- /dev/null +++ b/sites/www/content/showcase/so-vegan.md @@ -0,0 +1,47 @@ +--- +title: So Vegan +description: So Vegan helps people discover and prepare plant-based foods through their website, cookbooks, YouTube videos, and recipe app. +headline: So Vegan +summary: So Vegan wins Apple’s App of the Day twice with Flutter +appName: So Vegan +companyName: So Vegan +logo: images/third_party/case_studies/so-vegan/logo.webp +card: images/third_party/case_studies/so-vegan/case_study_card.png +poster: images/third_party/case_studies/so-vegan/case_study_poster.png +locations: + - North America +platforms: + - Mobile +industries: + - Travel & Lifestyle +tags: + - android + - ios +publishDate: 2022-10-27 +--- + +**Goal** + +For many years, So Vegan had built an audience through their social media pages, YouTube videos, and printed cookbooks. They had millions of followers across their various channels, but lacked a centralized platform that combined the ability to host their existing core recipe content in a digital format, while also giving their team a platform to publish new recipes, videos, and high-quality images. + +**Why Flutter?** + +So Vegan reached out to a development agency, [Arch](https://www.wearearch.com/), to help them build their first-ever mobile [app](https://www.wearesovegan.com/get-to-know-the-new-so-vegan-app/). With a small development team consisting of two developers, a designer and a product owner, So Vegan wanted a solution that would be easy to manage and built to scale over time. Additionally, they wanted to deploy to both iOS and Android in order to reach the largest possible audience. Arch decided on Flutter, not only because of its cross-platform capabilities, but because it offered their team a blank canvas to capture the essence of their brand. + +Using Flutter, [Arch](https://www.wearearch.com/) developed a high-fidelity prototype for So Vegan, including support for a premium/freemium model as an additional revenue source. Flutter allowed them to ensure that the app was easy for the So Vegan team to maintain, leveraging a single core CMS for uploading and content management within the app. + + + +**Their solution** + +With the green light from So Vegan, the agency built a sleek cross-platform app entirely in Flutter. “The developer experience is second to none,” said Andy Lonsdale, Head of Frontend Development at Arch. They leaned on Flutter’s Hot Reload capabilities and built-in Dev Tools to save development time. Additionally, Flutter’s short learning curve helped them onboard and teach new developers. + +The team used the Build Runner for internal code generation packages, which helped them maintain code standards and increase efficiency. They also drew from a series of libraries, including [Flutter Bloc,](https://pub.dev/packages/flutter_bloc) and [Hive](https://pub.dev/packages/hive) which allowed them to create a higher-quality app in the short timeframe So Vegan needed. + +***“We're really pleased with the performance and the look-and-feel of the So VeganApp. The use of Flutter to create a cross-platform product has been a huge benefit for us in being able to provide the application to as much of our audience as possible"*** + +\- Ben Pook and Roxy Pope, Founders, So Vegan + +**Results** + +The app now has over 45,000 downloads, and has been generating revenue since launch. It was featured by Apple as App Of The Day on two separate occasions, and has won a [Web Excellence award](https://we-awards.com/winner/so-vegan/) for its user experience design. So Vegan has now successfully activated a new channel for the brand, allowing them to further support users on finding delicious vegan recipes, whilst engaging a completely new audience. diff --git a/sites/www/content/showcase/sozcu.md b/sites/www/content/showcase/sozcu.md new file mode 100644 index 00000000000..a82428963a7 --- /dev/null +++ b/sites/www/content/showcase/sozcu.md @@ -0,0 +1,63 @@ +--- +title: Estetik Yayıncılık +description: Turkish publisher Estetik Yayıncılık rebuilt their Sözcü newspaper app with Flutter, increasing ad revenue by 331%. +headline: Sözcü +summary: Estetik Yayıncılık increases ad revenue by 331% with Flutter +appName: Sözcü +companyName: Estetik Yayıncılık +logo: images/third_party/case_studies/sozcu/logo.webp +card: images/third_party/case_studies/sozcu/case_study_card.png +poster: images/third_party/case_studies/sozcu/case_study_poster.png +locations: + - Asia + - Europe +platforms: + - Mobile +industries: + - Travel & Lifestyle +successMetrics: + - perc: 149 + desc: average eCPM + - perc: 476 + desc: ad request eCPM + - perc: 131 + desc: ad delivery rate +tags: + - mobile + - android + - ios + - monetization +publishDate: 2023-12-14 +--- + +**Goal** + +Estetik Yayıncılık’s flagship newspaper, *Sözcü*, is available online, in print, and as a mobile app for Android and iOS. As a free app, *Sözcü* relies on ads for revenue, so the team was interested in new ways to increase ad revenue while reducing the cost of managing their ad infrastructure. They also wanted to streamline their development work and bring it in-house, as a lot of the work was outsourced and difficult to manage. + +**Why Flutter?** + +Flutter offered Estetik Yayıncılık the chance to manage both their Android and iOS apps from a single codebase, which would not only reduce their development work, but also allow them to bring more of that work in-house. So, with the help of the resources on Flutter.dev, the team built a proof of concept and tested it with a portion of their user base. + +They found that not only did users enjoy the Flutter-based app, the development team enjoyed creating it. Flutter offered them new features and widgets that gave them more flexibility with a fraction of the effort, so they decided to rewrite their apps in Flutter and roll them out to their entire user base. + + + +**Their solution** + +Estetik Yayıncılık rewrote the *Sözcü* app for Android and iOS with Flutter over the course of about six months. In addition to bringing the development work in-house, they also implemented new features and ad formats, such as [app open ads](https://developers.google.com/admob/android/app-open) and [adaptive](https://developers.google.com/admob/android/banner/inline-adaptive), rewarded, and [sticky](https://developers.google.com/admob/android/banner/anchored-adaptive) banners. + +*“We've witnessed substantial improvements in our revenue and product deployment timelines since adopting Google's Flutter framework. Flutter's single codebase for both mobile and web apps has streamlined our development process, reducing costs and speeding up market entry. This shift has enhanced user experience and engagement, directly boosting our revenue. Flutter's customizable widgets have been key in creating appealing interfaces, strengthening our position in a competitive market”* + +\- REHA BASOGUL, CDO, Estetik Yayıncılık + +**Results** + +Flutter allowed Estetik Yayıncılık to reduce their reliance on outsourcing for their development work, reducing costs and giving them greater creative control over their apps. It also reduced their development time and made the entire process faster and more efficient. + +By leveraging Flutter’s integrated ad support, including new ad formats and features, Estetik Yayıncılık was also able to meet their ambitious revenue goals. Compared to their original app, the updated Flutter-based app led to a 331% increase in Ad Exchange revenue, as well as: + +- +37% ad clickthrough rate +- +149% average eCPM +- +476% ad request eCPM +- +131% ad delivery rate +- +25% viewable ad impressions diff --git a/sites/www/content/showcase/stage.md b/sites/www/content/showcase/stage.md new file mode 100644 index 00000000000..95100f1a2b9 --- /dev/null +++ b/sites/www/content/showcase/stage.md @@ -0,0 +1,58 @@ +--- +title: STAGE +description: Learn how streaming platform STAGE uses Flutter and Firebase to cut release time in half while serving 1.8 million daily active users. +headline: STAGE +summary: STAGE uses Firebase and Flutter to cut release time in half +appName: STAGE +companyName: STAGE +logo: images/third_party/case_studies/stage/logo.png +card: images/third_party/case_studies/stage/case_study_card.png +poster: images/third_party/case_studies/stage/case_study_poster.png +locations: + - Asia +platforms: + - Mobile + - Desktop +industries: + - Travel & Lifestyle +successMetrics: + - perc: 50 + desc: increase in developer efficiency + - perc: 100 + desc: faster app release cycles + - perc: 100 + desc: faster feature releases +tags: + - android + - ios + - desktop +publishDate: 2023-12-14 +--- + +**Introduction** + +[STAGE](https://play.google.com/store/apps/details?id=in.stage) is a feature-rich streaming platform catering to a wide range of Indian dialects and languages. From poetry to movies to motivational content, STAGE offers almost every form of entertainment on their platform to over 1.8 million daily active users. + +**Challenges** + +To fulfill their mission of providing tailored content to a wide range of Indian audiences, STAGE needed to offer apps for a variety of platforms, including iOS, Android, macOS, and Android TV. But with a small development team, they needed a highly efficient way to build this multi-platform app, with infrastructure that could store and deliver their content to users securely and in real time for a smooth viewing experience that would help them stand out in the competitive streaming market. + + + +**Solution** + +After a month of trying to build each app in parallel, the team learned about [Flutter](https://flutter.dev/) in a [Google Developer Group](https://developers.google.com/community/gdg). It seemed like a promising solution, as it would allow them to develop all of their apps from a single codebase, saving them a considerable amount of time. They were also excited about features like hot reload, which allows developers to immediately see the results of their code changes in the app, allowing for faster development and painless debugging. Flutter’s rich set of customizable widgets also makes it easy to build beautiful and responsive user interfaces. + +The team found Flutter very easy to learn, in part because it uses a single programming language, Dart, for both front-end and back-end development. The Flutter community helped STAGE’s small developer team get up to speed quickly. + +STAGE decided to pair Flutter’s front-end tools with [Firebase](https://firebase.google.com/)’s complementary back-end services for full-lifecycle support. They used Firebase’s fully managed back-end services to get to market faster, with [Realtime Database](https://firebase.google.com/products/realtime-database) and [Cloud Storage](https://firebase.google.com/products/storage) at the heart to store, sync, and deliver content to users in real time, which is especially critical for live broadcasts. They used [Authentication](https://firebase.google.com/products/auth) to set up a secure user sign-in flow, [Cloud Functions](https://firebase.google.com/products/functions) to automate backend tasks, and integrated Google Analytics to better understand their user behavior. + +In addition to infrastructure products, Firebase also provides tools to improve app quality and drive business growth. The STAGE team used testing and monitoring products [Test Lab](https://firebase.google.com/products/test-lab) and [Crashlytics](https://firebase.google.com/products/crashlytics) to ensure their app was performant and stable on a variety of devices, and engagement products like [Cloud Messaging](https://firebase.google.com/products/cloud-messaging) to deliver personalized notifications. + +Recently, STAGE used [Remote Config](https://firebase.google.com/products/remote-config) and [A/B Testing](https://firebase.google.com/products/ab-testing) to evaluate various free-trial offers with different audience segments. [Remote Config](https://firebase.google.com/products/remote-config) allowed them to personalize the offers to match user behavior and preferences, and optimize them based on early insights - without requiring an app update. The test was easy to set up and quick to run, and the team was able to roll out the best offers to scale the campaign, which helped increase user conversions by 25%. + +Next up, STAGE plans to build a full-featured desktop app with Flutter and Firebase, with support for LG and Samsung TVs coming soon. + +*“Flutter is a powerful and flexible mobile development framework with a wide range of built-in widgets and tools that make it easy to build beautiful, feature-rich multi platform apps. We love how it pairs with Firebase to not only give us the infrastructure we need for the backbone of our app, but also tools to help us improve quality, engage users, and test new ideas safely.”* + +\- Mrinal, Flutter Lead, STAGE diff --git a/sites/www/content/showcase/sua-musica.md b/sites/www/content/showcase/sua-musica.md new file mode 100644 index 00000000000..c3661a4cb50 --- /dev/null +++ b/sites/www/content/showcase/sua-musica.md @@ -0,0 +1,29 @@ +--- +title: Sua Musica +description: Watch the video above to learn how the team at Sua Musica took advantage of the Google Mobile Ads SDK for Flutter to immediately improve the user experience. +headline: Sua Musica +summary: Supporting 10 million monthly users with Sua Musica +companyName: Sua Musica +logo: images/third_party/case_studies/sua-musica/logo.webp +card: images/third_party/case_studies/sua-musica/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/xSDLSPodzUo" +locations: + - South America +platforms: + - Mobile +industries: + - Travel & Lifestyle +successMetrics: + - perc: 350 + desc: increase in impressions + - perc: 13 + desc: increase in eCPM +tags: + - mobile + - android + - ios + - monetization +publishDate: 2021-11-05 +--- + +Watch the video above to learn how the team at Sua Musica took advantage of the Google Mobile Ads SDK for Flutter to immediately improve the user experience. diff --git a/sites/www/content/showcase/supercell.md b/sites/www/content/showcase/supercell.md new file mode 100644 index 00000000000..36ec90b6a3d --- /dev/null +++ b/sites/www/content/showcase/supercell.md @@ -0,0 +1,46 @@ +--- +title: Supercell +description: Based in Helsinki, Finland, Supercell has been producing genre-defining games since 2010. Now with offices in San Francisco, Seoul, and Shanghai, they’ve brought several popular games to the global market including Hay Day, Clash of Clans, and Brawl Stars. +headline: Supercell +summary: Flutter helps Supercell reduce Supercell ID core code size by 45% +appName: Supercell +companyName: Supercell +logo: images/third_party/case_studies/supercell/logo.png +card: images/third_party/case_studies/supercell/case_study_card.png +poster: images/third_party/case_studies/supercell/case_study_poster.png +locations: + - Europe +platforms: + - Mobile + - Desktop +industries: + - Games +tags: + - android + - ios + - desktop + - games +publishDate: 2024-05-14 +--- + +**Goal** + +After creating several popular multiplatform games, Supercell [developed an SDK](https://supercell.com/en/supercell-id/) to enable players to switch platforms and devices without losing their progress. But maintaining separate codebases for Supercell ID on iOS, Android, and macOS was inefficient, and wasn’t compatible with desktop development builds. So in the spring of 2022, Supercell went looking for a solution that could unify their codebase and give them the cross-platform support they needed. + +**Why Flutter?** + +While researching various game UI frameworks, the team heard about Flutter and decided to check it out. After reading the documentation on flutter.dev, they built a proof of concept and were impressed with its multi platform capabilities and promise of developer efficiency. Supercell decided to move ahead and relaunch their SDK with Flutter. + + + +**Their solution** + +The Supercell team picked up Flutter quickly, and were especially impressed by its single codebase and portability. Developing the UI was simple and quick, and after just about a year of development, their new SDK was ready to relaunch. + +“*Flutter was definitely easy to learn, and developing the UI/UX is relatively straightforward and efficient*.” + +\- Ville Kivistö, Team Lead, Supercell + +**Results** + +The new Flutter-built SDK brought Supercell ID functionality to developers using desktop builds, creating a more seamless multiplatform player experience and helped to reduce the core code for Supercell ID by 45%, even with added desktop support. Supercell intends to continue using Flutter to streamline their codebase and provide a unified experience across every platform. diff --git a/sites/www/content/showcase/superlist.md b/sites/www/content/showcase/superlist.md new file mode 100644 index 00000000000..097fb7af056 --- /dev/null +++ b/sites/www/content/showcase/superlist.md @@ -0,0 +1,26 @@ +--- +title: Superlist +description: Learn how Superlist uses Flutter to rethink task and project management across mobile, web, and desktop. +headline: Superlist +summary: Rethinking task and project management with Flutter +appName: Superlist +companyName: Superlist +logo: images/third_party/case_studies/superlist/logo.png +card: images/third_party/case_studies/superlist/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/ihpcubpQHA0" +locations: + - North America +platforms: + - Mobile + - Web + - Desktop +industries: + - Productivity +tags: + - desktop + - macos + - web +publishDate: 2022-06-14 +--- + +Listen to Brandon Arnold, Co-Founder of Superlist as he shares how Flutter was used to change the way teams and individuals approach managing tasks and workloads. diff --git a/sites/www/content/showcase/talabat.md b/sites/www/content/showcase/talabat.md new file mode 100644 index 00000000000..ff32d226101 --- /dev/null +++ b/sites/www/content/showcase/talabat.md @@ -0,0 +1,51 @@ +--- +title: talabat +description: "Learn how talabat, the MENA region's leading on-demand delivery platform, quadrupled their release cadence and upskilled 50+ engineers by migrating to Flutter." +headline: "talabat" +summary: "talabat transitioned from siloed native development to a unified Flutter codebase, resulting in faster releases and a more stable, performant experience for millions of users." +companyName: talabat +appName: talabat +logo: images/third_party/case_studies/talabat/talabat_logo.png +card: images/third_party/case_studies/talabat/talabat_card.png +videoEmbedUrl: "https://www.youtube.com/embed/A3ApoV_QRio" +locations: + - Asia +platforms: + - Mobile +industries: + - Travel & Lifestyle +successMetrics: + - text: 4x + desc: Increase in release cadence + - text: 50+ + desc: Engineers upskilled +tags: + - mobile + - Android + - iOS +publishDate: 2026-05-05 +--- + + +talabat is the leading on-demand delivery platform in the Middle East and North Africa (MENA) region, delivering food, groceries, and essentials to millions of customers across eight countries. As the leading delivery platform in MENA, talabat’s success relies on scale. However, by 2021, siloed native development had created duplicated efforts and inconsistent UI across eight countries. In addition, maintaining separate codebases and design systems resulted in noticeable UI inconsistencies and significant operational overhead. + +**Why Flutter?** + +To address these challenges, talabat began evaluating a migration to Flutter. The primary goal was to reduce the complexity of managing two different codebases and teams while maintaining the high performance their users expected. Flutter’s cross-platform capabilities offered a way to unify their engineering efforts without sacrificing the seamless experience required for their millions of customers using various device types. Additionally, the smooth learning curve for Dart and Flutter made it an attractive option for upskilling their existing team of experts. + +**Their solution: Building with Flutter** + +For an application of talabat's scale, a "big bang" rewrite was not an option. Instead, they adopted a carefully crafted, incremental migration strategy using Flutter's [**Add-to-App**](https://docs.flutter.dev/add-to-app) approach. They began by implementing static UI and low-traffic screens to prove the concept and gain developer buy-in. As a "real endurance test," they migrated the restaurant menu screen—one of the most critical and high-traffic areas of the application. + +This incremental success eased internal skepticism and paved the way for a full migration. talabat focused on de-risking the process by migrating screen by screen, relying on the experience gained during the initial implementation. To support this massive shift, they upskilled a team of over 50 engineers who already possessed deep product expertise, ensuring that the migration was led by those who knew the application best. + +**Key results and business impact** + +The impact of migrating to Flutter was felt immediately upon completing the transition in 2024. By unifying their development process, talabat achieved remarkable efficiency and performance gains: + +* **4x release cadence:** Since the migration, talabat's release cadence has increased by 4x, enabling them to ship features and fixes much faster than before. +* **Improved app stability:** The migration led to a clear improvement in app stability across both iOS and Android. +* **Enhanced performance:** talabat observed a Faster 'start-to-interactive' times and a significant reduction in frozen frames. +* **Successful team transformation:** Over 50 native engineers were successfully upskilled to Flutter, breaking down team silos and enabling better collaboration and knowledge sharing. + +
\ No newline at end of file diff --git a/sites/www/content/showcase/tatsuya-inoue.md b/sites/www/content/showcase/tatsuya-inoue.md new file mode 100644 index 00000000000..44c666bb15a --- /dev/null +++ b/sites/www/content/showcase/tatsuya-inoue.md @@ -0,0 +1,46 @@ +--- +title: Tatsuya Inoue +description: Independent developer Tatsuya Inoue used Flutter to build his first mobile game, TiniesMerge, in just three months. +headline: Tatsuya Inoue +summary: Tatsuya Inoue makes his acclaimed debut with Flutter +appName: TiniesMerge +companyName: Tatsuya Inoue +logo: images/third_party/case_studies/tatsuya-inoue/logo.webp +card: images/third_party/case_studies/tatsuya-inoue/case_study_card.png +poster: images/third_party/case_studies/tatsuya-inoue/case_study_poster.png +locations: + - Asia +platforms: + - Mobile +industries: + - Games +tags: + - developer-story +publishDate: 2024-03-19 +--- + +**Goal** + +Tatsuya Inoue had always wanted to be a game developer, but he’d never been sure where to start. Finally, he decided it was time to go for it, and set himself a goal of creating a simple mobile game for iOS and Android. + +**Why Flutter?** + +At first, Tatsuya tried developing a native iOS app, but he didn’t want to have to start from scratch when he scaled the game to Android. So he started looking for a cross-platform solution, and after testing several options including Unity, he landed on Flutter for its ease of use and readymade [game toolkit](https://docs.flutter.dev/resources/games-toolkit) and because he was familiar with Dart from his day job. + + + +**His solution** + +Tatsuya wanted to release his game as quickly as possible so he could start A/B testing and gathering feedback. Flutter made it easy for him to work quickly, leaning on the tutorials available on flutter.dev and the premade components in the Flutter Casual Games Toolkit. + +As he worked, he used hot reload to see what he was building in real time, which made it easier for him to develop quickly. + +*“Developing my first game with Flutter was so easy and fun — I think more people should try it!.”* + +\- Tatsuya Inoue, developer + +**Results** + +Tatsuya used Flutter to build his first-ever game, [TiniesMerge](https://play.google.com/store/apps/details?id=com.ttydev.tiniesmerge), for both Android and iOS in just three months. That year, it was a top 20 winning title in the Indie Games Festival. + +Tatsuya says he had such a good time developing his game that he plans to build more in the future. diff --git a/sites/www/content/showcase/teamlab.md b/sites/www/content/showcase/teamlab.md new file mode 100644 index 00000000000..0e68ffd86f4 --- /dev/null +++ b/sites/www/content/showcase/teamlab.md @@ -0,0 +1,20 @@ +--- +title: teamLab +description: Tokyo-based art collective teamLab uses Flutter to extend immersive digital experiences to over 35 million people. +headline: teamLab +summary: Flutter enables art, digital solutions, and rapid development +appName: teamLab +companyName: teamLab +logo: images/third_party/case_studies/teamlab/logo.png +card: images/third_party/case_studies/teamlab/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/OyS812ZoTzw" +locations: + - Asia +platforms: + - Mobile +industries: + - Travel & Lifestyle +publishDate: 2025-05-21 +--- + +Explore how teamLab uses Flutter in art and digital solutions, extending experiences to over 35 million people. Learn why they choose Flutter for app development, citing ease and speed in changing services, and improved development efficiency. diff --git a/sites/www/content/showcase/tencent-cloud-chat.md b/sites/www/content/showcase/tencent-cloud-chat.md new file mode 100644 index 00000000000..250c4cafa0f --- /dev/null +++ b/sites/www/content/showcase/tencent-cloud-chat.md @@ -0,0 +1,58 @@ +--- +title: Tencent Cloud Chat +description: Tencent Cloud is the cloud computing business of global technology company Tencent. It offers a comprehensive suite of cloud services including computing, storage, networking, databases, security, and management tools to help individuals and organizations of all sizes build and run applications and services in the cloud. +headline: Tencent Cloud Chat +summary: Tencent Cloud Chat increased development efficiency by 77% with Flutter +companyName: Tencent Cloud +logo: images/third_party/case_studies/tencent-cloud-chat/logo.png +card: images/third_party/case_studies/tencent-cloud-chat/case_study_card.png +poster: images/third_party/case_studies/tencent-cloud-chat/case_study_poster.png +locations: + - Asia +platforms: + - Web +industries: + - Productivity +successMetrics: + - perc: 77 + desc: increase in development velocity + - perc: 94.6 + desc: shared code +tags: + - web +publishDate: 2023-06-30 +--- + +**Goal** + +[Tencent Cloud Chat](https://trtc.tencentcloud.com/products/chat?utm_source=gfs&utm_medium=link&utm_campaign=%E6%B8%A0%E9%81%93&_channel_track_key=k6WgfCKn) is a Chat SDK, with a UIKit component library and Voice/Video Calls module, designed to help customers quickly build an in-app chat module. They are currently ranked number one in China's chat service market and are expanding internationally. + +Before Tencent Cloud started using Flutter, app development was typically done using native tools for each platform. This approach was time-consuming and complex, as developers had to learn multiple programming languages and tools and maintain separate codebases for each platform. It could also be challenging to ensure consistency across platforms, as each platform had its own design guidelines and user interface components. + +**Why Flutter?** + +To address these challenges, Tencent Cloud began to search for a modern, reactive framework that could help their customers build apps for multiple platforms with a single codebase. After a thorough evaluation of cross-platform frameworks such as Flutter, React Native, and Lynx, the team chose Flutter for its excellent performance, user experience, development efficiency, robust community support, and comprehensive documentation. + +Additionally, Flutter's easy-to-learn programming language, customizable widgets, and rich animation libraries made it an ideal choice for developers who are looking to transfer from other frameworks and want to quickly learn and start building high-quality SDKs and applications. + + + +**Their solution** + +Tencent Cloud decided to use Flutter to build Tencent Cloud Chat. Flutter's support for custom widgets and themes allowed them to create unique and visually appealing user interfaces that are consistent across different platforms, enhancing the user experience and improving engagements. The team used Flutter’s hot reload feature to see their code changes in real time, which sped up the development process and made it more efficient. Additionally, Flutter's customizable widgets and rich animation libraries allowed them to create unique and engaging user interfaces quickly and easily. + +To help their customers integrate Tencent Cloud Chat into their apps, the team built a [Flutter UIKit component library](https://www.tencentcloud.com/document/product/1047/50059), which encapsulates all the underlying capabilities of the Flutter Chat SDK. It can be used on a variety of platforms including iOS, Android, macOS, Windows, and web. The [recently released version 2.0](https://pub.dev/packages/tencent_cloud_chat_uikit) includes a new wide-screen mode UI and is compatible with all Flutter-supported platforms except Linux. + +The Tencent team enjoyed Flutter so much that they began to build other solutions with it, including [TRTC](https://trtc.tencentcloud.com/products/call?utm_source=gfs&utm_medium=link&utm_content=call&utm_campaign=%E6%B8%A0%E9%81%93&_channel_track_key=EPwzXr9R) for real-time audio and video, as well as an in-game chat solution. Tencent Cloud also began recommending Flutter to their customers as the preferred framework for building their applications. + +*“Our team is very pleased with Dart and Flutter. The coding experience was much smoother, more efficient, and highly user-friendly, allowing for a more streamlined and gratifying development experience. Flutter has been immensely pleasurable as it offers seamless and hassle-free coding.”* + +- Tencent Cloud Team + +**Results** + +With the introduction of Flutter, Tencent Cloud was able to streamline app development by providing a single codebase that could be used to build apps for multiple platforms. This not only reduced development time and complexity, it also ensured consistency across platforms for both their own projects and those of their customers. As a result, Tencent Cloud received fewer consultation requests, saw decreased costs, and enjoyed a faster time-to-market. They have also seen a significant increase in overall revenue, with a growth rate of around 34%. + +Flutter has also brought significant value to Tencent Cloud’s customers. One client, Ourschool, was able to reduce manpower by 38% and improved development efficiency by 47%. According to their online monitoring system, their Flutter application is more than 99.99% stable, and bug rates decreased by approximately 30%. Another client, FacePro, was able to achieve with 2 developers what previously required 5-6, while reducing development costs by 70%, manpower by 46%, and the development cycle by more than 50%. Flutter also increased the development efficiency of Tencent Cloud Chat by 77%. + +Tencent Cloud also helped translate Flutter's official documentation from English to Chinese and made [several contributions](https://pub.dev/publishers/comm.qq.com/packages) to the Flutter community. These included a language internationalization tool that helps users create multi-language interfaces and a document auto-generation system based on the comments in the code and pre-configured rules. Both tools will be open-sourced soon. diff --git a/sites/www/content/showcase/tencent.md b/sites/www/content/showcase/tencent.md new file mode 100644 index 00000000000..39c83ef82d0 --- /dev/null +++ b/sites/www/content/showcase/tencent.md @@ -0,0 +1,30 @@ +--- +title: Tencent +description: Several teams at Tencent needed a front end solution that could help improve development efficiency, increase app parity, and deliver an excellent developer experience. Watch the video above to learn why several teams at Tencent have moved their apps completely to Flutter. +headline: Tencent +summary: Tencent takes large, strategic bet on Flutter +companyName: Tencent +logo: images/third_party/case_studies/tencent/logo.png +card: images/third_party/case_studies/tencent/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/DVGIBU109nI" +locations: + - Asia +platforms: + - Mobile +industries: + - Productivity +successMetrics: + - perc: 80 + desc: increased debugging efficiency + - perc: 90 + desc: multiplatform code + - perc: 33 + desc: reduction in development effort +tags: + - mobile + - android + - ios +publishDate: 2021-11-05 +--- + +Several teams at Tencent needed a front end solution that could help improve development efficiency, increase app parity, and deliver an excellent developer experience. Watch the video above to learn why several teams at Tencent have moved their apps completely to Flutter. diff --git a/sites/www/content/showcase/tonal.md b/sites/www/content/showcase/tonal.md new file mode 100644 index 00000000000..95164716c65 --- /dev/null +++ b/sites/www/content/showcase/tonal.md @@ -0,0 +1,45 @@ +--- +title: Tonal +description: Ensuring feature parity at Tonal with Flutter +headline: Tonal +summary: Ensuring feature parity at Tonal with Flutter +appName: Tonal +companyName: Tonal +logo: images/third_party/case_studies/tonal/logo.webp +card: images/third_party/case_studies/tonal/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/wivGm7z7Z1M" +locations: + - North America +platforms: + - Mobile +industries: + - Health + - Travel & Lifestyle +tags: + - mobile + - android + - ios +publishDate: 2022-08-03 +--- + +**Goal** + +Tonal’s mobile engineering team started work on the mobile app only a few months before the company announced their unique at-home fitness product, so the team needed to move as quickly as possible. Tonal’s native Android software team was dedicated to building the native Android app that runs on the Tonal hardware, which left only one software engineer to build the mobile app from the ground up. Having never shipped a mobile app before, Tonal didn’t know what percentage of users would use Android vs. iOS, but they did know that they wanted to give both platforms equal attention and maintain feature parity. They also needed a framework that would enable them to build a custom, branded user interface that felt uniquely Tonal while still feeling like a friendly, native mobile app. And because the app would need to be maintained over a long period of time, they needed a solution that would allow it to scale alongside a growing team of software engineers. + +**Why Flutter?** + +Tonal was immediately impressed with Flutter’s architecture. Unlike other cross-platform frameworks, Flutter handles rendering the user interface. This fundamental architecture decision made Tonal more confident that they would be able to build a custom experience without spending a lot of time debugging visual issues across platforms. Despite the fact that no one on the team had experience with Dart, the team was confident after experimenting with the language and finding it friendly and intuitive. And since the framework provides a code formatter, code linter, static code analyzer, and documentation on standard conventions, the team was able to start building features very quickly. In less than half the time it took to build a proof of concept in another framework, the Tonal team was able to recreate the entire app with Flutter. + + + +**Their Solution** + +Despite coming from a wide range of backgrounds and experiences, Dart and Flutter were easy for everyone on the team to pick up quickly. Tonal was able to take the app from just an idea to a full-fledged, production-ready mobile app deployed to actual users in less than a year. Flutter made it easy to move quickly with features like stateful hot reloading, enabled by Dart’s ability to compile both AOT and JIT. Since the app’s launch in 2019, the Tonal mobile team has been able to rapidly iterate on the app, releasing new versions of the app every two weeks. + +*“Flutter's developer experience is top-notch. Unlike most JavaScript frameworks that boast a 'hot reloading' developer experience, Flutter's hot reloading actually works reliably and is consistently very fast.”* + +*- Max Lapides, Mobile Software Engineering Manager, Tonal* + +**Results** + +Flutter made it easy to ship an app with very few engineering resources. When Tonal launched its mobile app in 2019, there were only two engineers on the project. But while the team has increased significantly since then, Flutter continues to support the ever-increasing complexity of the app as it scales with the company. Tonal has shipped an incredible array of features in the mobile app so far, including a custom charting library, animations with Rive, a leaderboard that lets you smoothly scroll through tens of thousands of active members, a custom native workout video player, and more, with new features on the way. All of this has been accomplished with full feature parity across iOS and Android. Flutter has liberated Tonal to focus on building awesome features and keeping their users engaged and delighted. diff --git a/sites/www/content/showcase/toyota.md b/sites/www/content/showcase/toyota.md new file mode 100644 index 00000000000..69d9a9c90da --- /dev/null +++ b/sites/www/content/showcase/toyota.md @@ -0,0 +1,47 @@ +--- +title: Toyota +description: Toyota is using Flutter to redesign their vehicle infotainment systems to bring a best-in-market digital experience to their customers. +headline: Toyota +summary: Improving infotainment systems at Toyota with Flutter +companyName: Toyota +logo: images/third_party/case_studies/toyota/logo.jpeg +card: images/third_party/case_studies/toyota/case_study_card.png +poster: images/third_party/case_studies/toyota/case_study_poster.png +locations: + - North America +platforms: + - Embedded +industries: + - Travel & Lifestyle +tags: + - embedded +publishDate: 2021-11-05 +--- + +**Goal** + +At Toyota, every part of the driving experience is considered and perfected, right down to the on-screen infotainment systems on the dash. While Toyota had always developed their in-vehicle technology themselves, they were intrigued by Flutter and wondered how it could help them improve the user experience for their drivers. + +**Why Flutter?** + +When Toyota discovered that Flutter was beginning to [support embedded devices](https://medium.com/googleplaydev/seamless-multi-platform-app-development-with-flutter-ea0e8003b0f9), they reached out about a partnership.​ + +Toyota customers expect the same high level of performance in their infotainment systems as they do from the driving experience, so it was important that the on-screen experience match the Toyota look and feel. Thanks to Flutter’s high-performing rendering engine and features such as AOT compilation, the team felt confident that they could build something that felt premium — more like a smartphone app than a traditional embedded system. + +Flutter’s developer experience was another big selling point. The ability to hot-reload the app on desktop and deliver to iOS and Android tablets is extremely helpful for user testing, helping Toyota collect faster feedback for a better user experience. + + + +**Their Solution** + +Toyota is currently using [Flutter’s Embedder API](https://flutter.dev/embedded) to develop their Linux-powered infotainment systems. By cross-compiling the engine and wrapping it in an embedder, the Flutter engine’s architecture makes it easy to embed in their target environment. + +Using Dart and the Flutter SDK software design, Toyota has created several in-house tools to improve their development process. Flutter’s declarative UI and “code-as-configuration” have allowed the team to create design tools that generate code to run and validate software immediately, without confusing middle tiers. + +***“Flutter's open source principles and high-growth developer community have been critical to our success.”*** + +\- Daniel Hall, Chief Engineer, Toyota Motor North America + +**Results** + +Flutter’s open-source principles and developer community have been critical to Toyota’s success. The team credits Flutter’s large and open ecosystem for helping them achieve their goals, and they look forward to the launch of their new infotainment system in future Toyota vehicles. diff --git a/sites/www/content/showcase/travelstart.md b/sites/www/content/showcase/travelstart.md new file mode 100644 index 00000000000..5230ea9124a --- /dev/null +++ b/sites/www/content/showcase/travelstart.md @@ -0,0 +1,50 @@ +--- +title: Travelstart +description: Learn how Africa's leading online travel agency migrated to Flutter, reducing the size of their codebase by 90% and their engineering team by 60%. +headline: Travelstart +summary: When the pandemic gave Africa’s leading online travel agency an opportunity to reconsider their tech stack, they turned to Flutter to migrate all their apps to a single codebase. +companyName: Travelstart +logo: images/third_party/case_studies/travelstart/logo.png +card: images/third_party/case_studies/travelstart/case_study_card.png +poster: images/third_party/case_studies/travelstart/case_study_poster.png +locations: + - Africa +platforms: + - Mobile +industries: + - Travel & Lifestyle +successMetrics: + - perc: 90 + desc: smaller codebase + - perc: 60 + desc: reduction in mobile engineering team +tags: + - mobile + - android + - ios +publishDate: 2022-08-25 +--- + +**Goal** + +[Travelstart](https://www.travelstart.com/) is Africa’s leading online travel agency, offering flights, hotel bookings, car rentals, vacation packages, and other travel services through their online booking engine. In addition to their [iOS](https://apps.apple.com/za/app/flapp-air-commuter/id957118897) and [Android](https://play.google.com/store/apps/details?id=za.co.travelstart.flapp) apps, they also wanted to offer a web platform to help hundreds of thousands of customers search, compare, and shop for travel bookings. + +Like many travel companies, the pandemic gave Travelstart an opportunity to pause and reconsider their tech stack, which had become unwieldy with only 10 developers to support both platforms. The team decided it was time to rewrite their apps with a cross-platform solution, so they turned to Flutter. + +**Why Flutter?** + +Although they considered native frameworks like iOS, Kotlin, and Jetpack Compose, what they really wanted was a multi-platform solution that would give them a single codebase to manage. They were also attracted to Flutter’s flexibility and the potential to make their developer team more efficient. + + + +**Their solution** + +Travelstart migrated to Flutter and found that having a single codebase dramatically reduced their development and release time. Because they didn’t have to rewrite their code for new platforms, they used the Flutter web build feature to create a new web app, which powers their mobile website. + +*“Flutter radically changed the way we build apps. It is currently the best framework to use for cross-platform development.”* + +**Results** + +Migrating to Flutter allows Travelstart to focus on features and product development instead of being bogged down with platform-specific issues. Their new codebase is 90% smaller than before, allowing them to reduce their mobile engineering team by 60%. Developer efficiency has skyrocketed, and the delivery pipeline is completely automated. New features take only days to develop and deliver, compared to the many weeks it would take previously. + +Next up, Travelstart wants to use Flutter to create new apps for their customers in the travel industry, as well as a desktop app for their operations team. diff --git a/sites/www/content/showcase/universal-studios.md b/sites/www/content/showcase/universal-studios.md new file mode 100644 index 00000000000..c130c568439 --- /dev/null +++ b/sites/www/content/showcase/universal-studios.md @@ -0,0 +1,32 @@ +--- +title: Universal Studios +description: Hear how the developers at Universal Destinations & Experiences utilize Flutter to create amazing guest experiences, so their visitors can spend more time enjoying their parks. +headline: Universal Studios +summary: Universal Studios build next generation experiences with Flutter +appName: Universal Studios +companyName: Universal Studios +logo: images/third_party/case_studies/universal-studios/logo.png +card: images/third_party/case_studies/universal-studios/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/JTk2Exr7FO4" +locations: + - Asia + - North America +platforms: + - Mobile +industries: + - Travel & Lifestyle +successMetrics: + - perc: 45 + desc: decrease in codebase size + - perc: 0.1 + desc: crash rate + - perc: 44 + desc: shorter release cycle +tags: + - mobile + - android + - ios +publishDate: 2024-05-14 +--- + +Hear how the developers at Universal Destinations & Experiences utilize Flutter to create amazing guest experiences, so their visitors can spend more time enjoying their parks! diff --git a/sites/www/content/showcase/us-department-of-veterans-affairs.md b/sites/www/content/showcase/us-department-of-veterans-affairs.md new file mode 100644 index 00000000000..bd3c56aad40 --- /dev/null +++ b/sites/www/content/showcase/us-department-of-veterans-affairs.md @@ -0,0 +1,27 @@ +--- +title: US Department of Veterans Affairs +description: When the VA decided to build an app to help veterans struggling with PTSD acclimate back into civilian life, they turned to Flutter. Learn more about their experience in the video above. +headline: US Department of Veterans Affairs +summary: 'STAIR: Helping veterans acclimate back into civilian life with Flutter' +companyName: US Department of Veterans Affairs +logo: images/third_party/case_studies/us-department-of-veterans-affairs/logo.webp +card: images/third_party/case_studies/us-department-of-veterans-affairs/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/2S-KkvFuLWs" +locations: + - North America +platforms: + - Mobile +industries: + - Health + - Travel & Lifestyle +successMetrics: + - perc: 30 + desc: decrease in development time +tags: + - mobile + - android + - ios +publishDate: 2021-11-05 +--- + +When the VA decided to build an app to help veterans struggling with PTSD acclimate back into civilian life, they turned to Flutter. Learn more about their experience in the video above. diff --git a/sites/www/content/showcase/virgin-money.md b/sites/www/content/showcase/virgin-money.md new file mode 100644 index 00000000000..93198627955 --- /dev/null +++ b/sites/www/content/showcase/virgin-money.md @@ -0,0 +1,52 @@ +--- +title: Virgin Money +description: Virgin Money is a leading UK bank, serving millions of retail and business customers, and bringing the best of the Virgin brand to make banking better and enable customers to achieve their financial goals. Led by its purpose of ‘making you happier about money’, Virgin Money offers a range of straightforward, award-winning products, including current accounts, credit cards, savings, investments, mortgages, pensions, loans and more. +headline: Virgin Money +summary: Virgin Money unifies app development with Flutter +appName: Virgin Money +companyName: Virgin Money +logo: images/third_party/case_studies/virgin-money/logo.png +card: images/third_party/case_studies/virgin-money/case_study_card.png +poster: images/third_party/case_studies/virgin-money/case_study_poster.png +locations: + - Europe +platforms: + - Mobile +industries: + - Banking & Finance +tags: + - mobile + - android + - ios +publishDate: 2024-05-14 +--- + +**Goal** + +Virgin Money were starting on a journey to combine their separate mobile apps for different financial products into a single customer app, to help them deliver a customer experience that lives up to their purpose of ‘making you happier about money’. + +At the same time, the team were thinking about how to simplify the way they work. Virgin Money has historically developed and maintained separate Android and iOS mobile apps, resulting in duplication and additional cost. The engineering team wanted to switch to a more unified app development process to speed up change and enable Virgin Money to deliver a class-leading user experience. However, they were cautious about moving away from the native programming they were familiar with to something new. + +**Why Flutter?** + +With those goals in mind, the team started to research what options were available to them to make development faster and more efficient, whilst maintaining the quality of app build they were used to. When you’re looking after customers’ money, it’s vital to get it right. + +They looked at the various technology options available and, following a selection process, with some creative proof of concepts along the way, they landed on Flutter. Building a brand new consolidated app for all customers would require significant time and resource, and the appeal of Flutter was only needing to do that once, rather than replicating the build and operate with two different mobile platforms. + + + +**Their solution** + +Flutter promised fast development, simplified testing, and a beautiful, on-brand experience. Most importantly for Virgin Money, it offered a unified toolkit, streamlining collaboration between QA, UX, and development. Eliminating platform-specific differences would mean less testing of unintended variations, saving valuable developer time. + +After allocating engineers to help validate their thinking and address any final concerns, the team got the go-ahead to begin adopting Flutter. As they began, Virgin Money leaned on the active Flutter community for solutions to pipeline, security, and other cross-platform challenges, finding it an invaluable source of assistance. + +“*Our senior engineers were up to speed from a standing start within a matter of weeks*.” + +\- Gary McLellan, Head of Engineering Frameworks & Core Mobile Apps, Virgin Money + +**Results** + +Virgin Money’s Swift and Kotlin developers found the transition to Flutter's declarative style relatively easy. Their top engineers were using Flutter and contributing changes within a week, and even their less experienced developers were able to adapt in a short amount of time. + +Cross-training their engineers in Flutter from Kotlin, Swift, and Java initially reduced productivity for about four weeks, but after the team got up to speed, Virgin Money’s developer efficiency increased dramatically. diff --git a/sites/www/content/showcase/wallace-gromit-ar.md b/sites/www/content/showcase/wallace-gromit-ar.md new file mode 100644 index 00000000000..c6415a96886 --- /dev/null +++ b/sites/www/content/showcase/wallace-gromit-ar.md @@ -0,0 +1,22 @@ +--- +title: Wallace & Gromit AR +description: When the team at Fictioneers embarked on a journey to deliver an innovative AR gaming experience, they turned to Flutter. Watch the video to learn how the team harnessed the power of Flutter in tandem with the power of Unity to create something truly unique. +headline: Wallace & Gromit AR +summary: Building an Innovative Storytelling Experience with Flutter +companyName: Wallace & Gromit AR +logo: images/third_party/case_studies/wallace-gromit-ar/logo.webp +card: images/third_party/case_studies/wallace-gromit-ar/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/G46cxw9mNFs" +locations: + - North America +platforms: + - Mobile +industries: + - Games +tags: + - mobile + - games +publishDate: 2021-11-05 +--- + +When the team at Fictioneers embarked on a journey to deliver an innovative AR gaming experience, they turned to Flutter. Watch the video to learn how the team harnessed the power of Flutter in tandem with the power of Unity to create something truly unique. diff --git a/sites/www/content/showcase/whirlpool.md b/sites/www/content/showcase/whirlpool.md new file mode 100644 index 00000000000..1bdfdb7882c --- /dev/null +++ b/sites/www/content/showcase/whirlpool.md @@ -0,0 +1,52 @@ +--- +title: Whirlpool +description: For more than 100 years, Whirlpool has manufactured home appliances designed to improve life at home. Now a Fortune 500 company with a worldwide presence, they build and distribute innovative home appliances through their Brastemp, Consul, Compra Certa, and KitchenAid brands. +headline: Whirlpool +summary: Whirlpool cuts development costs by 50% with Flutter +appName: Whirlpool +companyName: Whirlpool +logo: images/third_party/case_studies/whirlpool/logo.webp +card: images/third_party/case_studies/whirlpool/case_study_card.png +poster: images/third_party/case_studies/whirlpool/case_study_poster.png +locations: + - North America + - South America +platforms: + - Mobile +industries: + - Travel & Lifestyle +successMetrics: + - perc: 92 + desc: shared codebase + - perc: 50 + desc: reduction in development costs + - perc: 35 + desc: increase in development speed +publishDate: 2024-08-05 +--- + +**Goal** + +In November 2022, Whirlpool wanted to expand the growth of [Compra Certa](https://www.compracerta.com.br/), their online appliance marketplace in Brazil. While Compra Certa already had a robust and popular e-commerce website, it didn’t yet have a dedicated mobile app. So the Whirlpool team decided to see whether an app channel could help them increase their consumer base and purchase frequency. They engaged [Kobe Apps](https://kobe.io/), a mobile app SaaS Platform built in Flutter, to design and build a proof of concept. + +**Why Flutter?** + +To save time, Kobe Apps wanted to leverage their existing SaaS e-commerce platform for the Compra Certa app, but needed an efficient way to apply Whirlpool’s branding on multiple platforms. As longtime Firebase users, Kobe Apps was aware of Flutter and interested in its flexible widgets, multi-platform codebase, and portability. After reaching out to the Flutter community online and doing some quick testing, they decided to migrate their existing e-commerce solution to Flutter. + +**Their solution** + +Flutter allowed Kobe Apps to leverage native features and integrations of their mobile commerce engine alongside customizations and third-party services where they added value, providing branding and UI consistency across multiple channels, and making it fast and easy to build new features like new cashback and loyalty program features, which have proven to be some of the most important features for the new app. + +They found the developer experience with Flutter to be exceptionally positive. The comprehensive documentation allowed the team to get up to speed quickly, while the active community support helped them resolve any issues they encountered. + +Flutter’s Hot Reload feature significantly accelerated their development cycle by allowing them to make real-time code changes without restarting the app. Additionally, the extensive widget library helped them create a highly customized and responsive UI in alignment with Whirlpool's branding, allowing the team to create a personalized consumer onboarding journey for Compra Certa users. When combined with a single codebase for both Android and iOS, Kobe Apps found that Flutter reduced their development effort and gave Whirlpool an accelerated time-to-value. + +***“Flutter's rich set of features and tools made the development process smooth and efficient, enabling us to deliver a high-quality app in a short timeframe.”*** + +\- Rodrigo Freitas, CTO and co-founder, Kobe Apps + +**Results** + +Leveraging Flutter's extensive library of pre-built widgets and Hot Reload, Kobe App’s platform delivered the first version of the Compra Certa app in just 30 days, with a 92% sharable codebase, a 50% reduction in development costs, and a 35% increase in development speed. + +Post-launch, Whirlpool uses insights from Firebase Analytics to improve the app's performance and user engagement, and Firebase Crashlytics to quickly identify and resolve any stability issues. They also use Firebase Remote Config to make dynamic updates to the app's content and features without a full app release, ensuring that they can continuously optimize and enhance the Compra Certa app based on user feedback and needs. diff --git a/sites/www/content/showcase/wolt.md b/sites/www/content/showcase/wolt.md new file mode 100644 index 00000000000..6f109687ce2 --- /dev/null +++ b/sites/www/content/showcase/wolt.md @@ -0,0 +1,52 @@ +--- +title: Wolt +description: Wolt, a part of Doordash International since 2022, makes it easy to get the best restaurant food, groceries, gifts and more delivered to your home or office. With a team of over 10,000 people in 27 countries and 500+ cities, Wolt serves over 36 million registered users — and counting. +headline: Wolt +summary: Wolt taps into new markets with Flutter +appName: Wolt +companyName: Wolt +logo: images/third_party/case_studies/wolt/logo.webp +card: images/third_party/case_studies/wolt/case_study_card.png +poster: images/third_party/case_studies/wolt/case_study_poster.png +locations: + - Europe +platforms: + - Mobile +industries: + - Travel & Lifestyle +publishDate: 2024-08-05 +--- + +[Wolt](https://play.google.com/store/apps/details?id=com.wolt.picker&hl=en), a part of Doordash International since 2022, makes it easy to get the best restaurant food, groceries, gifts and more delivered to your home or office. With a team of over 10,000 people in 27 countries and 500+ cities, Wolt serves over 36 million registered users — and counting. + +**Goal** + +After years of successfully connecting restaurants, couriers, and hungry people with their popular food-delivery app, Wolt had begun to venture into other forms of retail delivery. This expansion required them to provide an efficient way for their merchant partners to manage orders. Their restaurant partners had been using the native Wolt Merchant app on iPads for years, but the expansion into retail meant the team would need to make the app accessible for all screens, necessitating the development of a new, cross-platform app that could seamlessly operate on both iOS and Android devices. + +**Why Flutter?** + +Wolt’s engineering team lead had worked with Flutter in the past, and recommended it for its ​​cross-platform development efficiency, responsive design, rapid feature development, scalability, and performance. Because the updated app would be critical to the company’s new business model, Wolt built a proof of concept before moving ahead. + + + +**Their solution** + +After evaluating both native and other cross platform options, Wolt decided to build a single, multiplatform app with Flutter because it would require less time and resources than maintaining separate codebases. Outside of the efficiency wins, the team made a few other bets: + +1. As Wolt transitioned into the wider retail market, the app would need to adapt to several new user scenarios. Flutter's ability to create responsive designs would help. +2. Flutter's widget-based architecture would help them achieve cohesive design across platforms to maintain brand integrity and provide a seamless user experience. +3. Flutter made it easy to integrate features that require native functionality, such as barcode scanning with the camera and connecting to printers via Bluetooth. + +All of these proved correct as just two Wolt developers built the first version of the new app in a month and a half, followed immediately by production-level testing. + +***“The Flutter community is an invaluable resource for learning and overcoming challenges.”*** + +\- Cagatay Ulusoy, Flutter Competence Lead, Wolt + +**Results** + +Adopting a cross-platform solution not only simplified the team’s workflow, it enabled much more rapid deployment across platforms. Wolt can now roll out simultaneous bi-weekly updates for iOS and Android, keeping their app competitive and responsive to user needs. It also allowed them to better manage their development costs by reducing the need for platform-specific development teams. + +Migrating to Flutter also gave Wolt the opportunity to fully integrate the new design system tokens provided by their design system team. This transition to a more unified and streamlined design approach was accomplished in less than two weeks, enabling Wolt to achieve a cohesive look and feel, reinforce their brand identity, and ensure a consistent user experience across Android and iOS devices. + +The Wolt team is also committed to sharing their progress with the Flutter community. So far, they’ve open-sourced two key solutions: the [Wolt Responsive Layout Grid](https://pub.dev/packages/wolt_responsive_layout_grid), which has 96 likes and an 80% popularity score on pub.dev, and the [Wolt Modal Sheet](https://pub.dev/packages/wolt_modal_sheet) (944 likes and a 97% popularity score on pub.dev), aimed at improving responsive design and modal interactions in Flutter apps. They’ve also organized Flutter meetups in the community and sponsored a conference, which they say has significantly improved their hiring ability. diff --git a/sites/www/content/showcase/xiaomi.md b/sites/www/content/showcase/xiaomi.md new file mode 100644 index 00000000000..4e51c339d85 --- /dev/null +++ b/sites/www/content/showcase/xiaomi.md @@ -0,0 +1,24 @@ +--- +title: Xiaomi +description: Take a look at how and why a small team at Chinese technology company, Xiaomi, used Flutter to develop a companion app for the firm’s popular new EV, the Xiaomi SU7. +headline: Xiaomi +summary: Xiaomi uses Flutter to fuel innovation +appName: Xiaomi +companyName: Xiaomi +logo: images/third_party/case_studies/xiaomi/logo.png +card: images/third_party/case_studies/xiaomi/case_study_card.png +videoEmbedUrl: "https://www.youtube.com/embed/wfD7ZQhwACU" +locations: + - Asia +platforms: + - Mobile +industries: + - Travel & Lifestyle +publishDate: 2024-08-05 +--- + +Xiaomi, a global tech leader, used Flutter to build the companion app for their popular new electric vehicle, the Xiaomi SU7. The app offers features like remote control, real-time updates, shopping, and community features, catering to both current and prospective Xiaomi car owners. Flutter's cross-platform capabilities and efficiency allowed the development team to build the app 60% faster than with native frameworks, ensuring a consistent user experience across iOS and Android. Xiaomi is excited about the results achieved with Flutter and plans to continue innovating in mobile app development. + +***Our commitment to innovation, combined with the power of Flutter, will continue to drive us forward as we create groundbreaking experiences for our users.*** + +-Xiaomi Engineering Lead diff --git a/sites/www/firebase.json b/sites/www/firebase.json new file mode 100644 index 00000000000..f033ce78832 --- /dev/null +++ b/sites/www/firebase.json @@ -0,0 +1,178 @@ +{ + "hosting": { + "public": "build/jaspr", + "cleanUrls": true, + "trailingSlash": false, + "ignore": [ + "firebase.json", + "**/.*" + ], + "redirects": [ + { "source": "/learn", "destination": "https://docs.flutter.dev/learn", "type": 301 }, + { "source": "/events/**", "destination": "/events", "type": 301 }, + { "source": "/go/:rest*", "destination": "https://docs.flutter.dev/go/:rest*", "type": 301 }, + { "source": "/docs", "destination": "https://docs.flutter.dev", "type": 301 }, + { "source": "/docs/:rest*", "destination": "https://docs.flutter.dev/:rest*", "type": 301 }, + { "source": "/jobs", "destination": "https://docs.flutter.dev/jobs", "type": 301 }, + { "source": "/jobs/:rest*", "destination": "https://docs.flutter.dev/jobs/:rest*", "type": 301 }, + { "source": "/create", "destination": "https://docs.flutter.dev/create", "type": 301 }, + { "source": "/dash", "destination": "https://docs.flutter.dev/dash", "type": 301 }, + { "source": "/search-all", "destination": "https://docs.flutter.dev/search-all", "type": 301 }, + { "source": "/search", "destination": "https://docs.flutter.dev/search", "type": 301 }, + { "source": "/to", "destination": "https://docs.flutter.dev/to", "type": 301 }, + { "source": "/to/:rest*", "destination": "https://docs.flutter.dev/to/:rest*", "type": 301 }, + { "source": "/tos", "destination": "https://docs.flutter.dev/tos", "type": 301 }, + + { "source": "/adoptawidget", "destination": "https://docs.flutter.dev/adoptawidget", "type": 301 }, + { "source": "/ads", "destination": "/monetization", "type": 301 }, + { "source": "/clock", "destination": "https://docs.flutter.dev/clock", "type": 302 }, + { "source": "/community/china", "destination": "https://docs.flutter.dev/community/china", "type": 301 }, + { "source": "/desktop", "destination": "/development/desktop", "type": 301 }, + { "source": "/embedded", "destination": "/development/embedded", "type": 301 }, + { "source": "/multi-platform", "destination": "/development", "type": 301 }, + { "source": "/multi-platform/:rest*", "destination": "/development/:rest*", "type": 301 }, + { "source": "/freecourse", "destination": "https://docs.flutter.dev/apprentice-giveaway", "type": 301 }, + { "source": "/apprentice-giveaway", "destination": "https://docs.flutter.dev/apprentice-giveaway", "type": 301 }, + { "source": "/security", "destination": "https://docs.flutter.dev/security", "type": 301 }, + { "source": "/subscribe", "destination": "/", "type": 301 }, + { "source": "/subscribe/preferences", "destination": "https://docs.flutter.dev/subscribe/preferences", "type": 301 }, + { "source": "/subscribe/subscribed", "destination": "/", "type": 301 }, + { "source": "/support", "destination": "/community", "type": 301 }, + { "source": "/wasm", "destination": "https://docs.flutter.dev/platform-integration/web/wasm", "type": 301 }, + { "source": "/web", "destination": "/development/web", "type": 301 }, + + { "source": "/accessibility", "destination": "https://docs.flutter.dev/ui/accessibility", "type": 301 }, + { "source": "/adaptations", "destination": "https://docs.flutter.dev/ui/adaptive-responsive/platform-adaptations", "type": 301 }, + { "source": "/adaptive*", "destination": "https://docs.flutter.dev/ui/adaptive-responsive", "type": 301 }, + { "source": "/android-release", "destination": "https://docs.flutter.dev/deployment/android", "type": 301 }, + { "source": "/animations", "destination": "https://docs.flutter.dev/ui/animations", "type": 301 }, + { "source": "/animations/:rest*", "destination": "https://docs.flutter.dev/ui/animations/:rest*", "type": 301 }, + { "source": "/assets-and-images", "destination": "https://docs.flutter.dev/ui/assets/assets-and-images", "type": 301 }, + { "source": "/bootstrap-into-dart", "destination": "https://docs.flutter.dev/resources/bootstrap-into-dart", "type": 301 }, + { "source": "/bug-reports", "destination": "https://docs.flutter.dev/resources/bug-reports", "type": 301 }, + { "source": "/cd", "destination": "https://docs.flutter.dev/deployment/cd", "type": 301 }, + { "source": "/codelabs", "destination": "https://docs.flutter.dev/codelabs", "type": 301 }, + { "source": "/cookbook", "destination": "https://docs.flutter.dev/cookbook", "type": 301 }, + { "source": "/cookbook/:rest*", "destination": "https://docs.flutter.dev/cookbook/:rest*", "type": 301 }, + { "source": "/custom-fonts", "destination": "https://docs.flutter.dev/cookbook/design/fonts", "type": 301 }, + { "source": "/debugging", "destination": "https://docs.flutter.dev/testing/debugging", "type": 301 }, + { "source": "/decouple-tracker", "destination": "https://github.com/flutter/flutter/issues/101479", "type": 301 }, + { "source": "/deferred-components", "destination": "https://docs.flutter.dev/perf/deferred-components", "type": 301 }, + { "source": "/developing-packages", "destination": "https://docs.flutter.dev/packages-and-plugins/developing-packages", "type": 301 }, + { "source": "/devtools/:rest*", "destination": "https://docs.flutter.dev/tools/devtools/:rest*", "type": 301 }, + { "source": "/download", "destination": "https://docs.flutter.dev/install", "type": 301 }, + { "source": "/downloads/:resource*", "destination": "/resources/:resource*", "type": 301 }, + { "source": "/faq", "destination": "https://docs.flutter.dev/resources/faq", "type": 301 }, + { "source": "/fastlane-cd", "destination": "https://docs.flutter.dev/deployment/cd#fastlane", "type": 301 }, + { "source": "/flutter-for-:platform*", "destination": "https://docs.flutter.dev/get-started/flutter-for/:platform*-devs", "type": 301 }, + { "source": "/formatting", "destination": "https://docs.flutter.dev/tools/formatting", "type": 301 }, + { "source": "/gestures", "destination": "https://docs.flutter.dev/ui/interactivity/gestures", "type": 301 }, + { "source": "/get-started", "destination": "https://docs.flutter.dev/get-started", "type": 301 }, + { "source": "/get-started/:rest*", "destination": "https://docs.flutter.dev/get-started/:rest*", "type": 301 }, + { "source": "/getting-started", "destination": "https://docs.flutter.dev/get-started", "type": 301 }, + { "source": "/hot-reload", "destination": "https://docs.flutter.dev/tools/hot-reload", "type": 301 }, + { "source": "/ide-setup", "destination": "https://docs.flutter.dev/tools/editors", "type": 301 }, + { "source": "/images/catalog-widget-placeholder.png", "destination": "/assets/images/docs/catalog-widget-placeholder.png", "type": 301 }, + { "source": "/impeller", "destination": "https://docs.flutter.dev/perf/impeller", "type": 301 }, + { "source": "/inspector", "destination": "https://docs.flutter.dev/tools/devtools/inspector", "type": 301 }, + { "source": "/intellij-ide", "destination": "https://docs.flutter.dev/tools/android-studio", "type": 301 }, + { "source": "/intellij-setup", "destination": "https://docs.flutter.dev/tools/android-studio", "type": 301 }, + { "source": "/ios-release", "destination": "https://docs.flutter.dev/deployment/ios", "type": 301 }, + { "source": "/json", "destination": "https://docs.flutter.dev/data-and-backend/serialization/json", "type": 301 }, + { "source": "/layout", "destination": "https://docs.flutter.dev/ui/layout/constraints#unbounded", "type": 301 }, + { "source": "/material-3-migration", "destination": "https://docs.flutter.dev/release/breaking-changes/material-3-migration", "type": 301 }, + { "source": "/networking", "destination": "https://docs.flutter.dev/cookbook/networking/fetch-data", "type": 301 }, + { "source": "/null-safety", "destination": "https://dart.dev/null-safety", "type": 301 }, + { "source": "/overview", "destination": "https://docs.flutter.dev/resources/architectural-overview", "type": 301 }, + { "source": "/platform-channels", "destination": "https://docs.flutter.dev/platform-integration/platform-channels", "type": 301 }, + { "source": "/platform-plugins*", "destination": "https://docs.flutter.dev/packages-and-plugins/using-packages", "type": 301 }, + { "source": "/platform-services", "destination": "https://docs.flutter.dev/platform-integration/platform-channels", "type": 301 }, + { "source": "/reading-writing-files", "destination": "https://docs.flutter.dev/cookbook/persistence/reading-writing-files", "type": 301 }, + { "source": "/responsive*", "destination": "https://docs.flutter.dev/ui/adaptive-responsive", "type": 301 }, + { "source": "/release-notes", "destination": "https://docs.flutter.dev/release/release-notes", "type": 301 }, + { "source": "/release-notes/:version*", "destination": "https://docs.flutter.dev/release/release-notes/:version*", "type": 301 }, + { "source": "/routing-and-navigation", "destination": "https://docs.flutter.dev/ui/navigation", "type": 301 }, + { "source": "/sdk-archive", "destination": "https://docs.flutter.dev/install/archive", "type": 301 }, + { "source": "/setup-:os*", "destination": "https://docs.flutter.dev/get-started", "type": 301 }, + { "source": "/setup", "destination": "https://docs.flutter.dev/get-started", "type": 301 }, + { "source": "/technical-overview", "destination": "https://docs.flutter.dev/resources/architectural-overview", "type": 301 }, + { "source": "/testing", "destination": "https://docs.flutter.dev/testing", "type": 301 }, + { "source": "/text-input", "destination": "https://docs.flutter.dev/cookbook/forms/text-input", "type": 301 }, + { "source": "/tutorials", "destination": "https://docs.flutter.dev/reference/learning-resources", "type": 301 }, + { "source": "/tutorials/animation", "destination": "https://docs.flutter.dev/ui/animations/tutorial", "type": 301 }, + { "source": "/tutorials/interactive", "destination": "https://docs.flutter.dev/ui/interactivity", "type": 301 }, + { "source": "/tutorials/internationalization", "destination": "https://docs.flutter.dev/ui/internationalization", "type": 301 }, + { "source": "/tutorials/layout", "destination": "https://docs.flutter.dev/ui/layout", "type": 301 }, + { "source": "/unbounded-constraints", "destination": "https://docs.flutter.dev/ui/layout/constraints#unbounded", "type": 301 }, + { "source": "/ui-performance", "destination": "https://docs.flutter.dev/perf/ui-performance", "type": 301 }, + { "source": "/upgrading", "destination": "https://docs.flutter.dev/install/upgrade", "type": 301 }, + { "source": "/using-ide-vscode", "destination": "https://docs.flutter.dev/tools/vs-code", "type": 301 }, + { "source": "/using-ide", "destination": "https://docs.flutter.dev/tools/android-studio", "type": 301 }, + { "source": "/using-packages", "destination": "https://docs.flutter.dev/packages-and-plugins/using-packages", "type": 301 }, + { "source": "/web-analogs", "destination": "https://docs.flutter.dev/get-started/flutter-for/web-devs", "type": 301 }, + { "source": "/webflutter.dev/web", "destination": "/web", "type": 301 }, + { "source": "/widgets-intro", "destination": "https://docs.flutter.dev/ui", "type": 301 }, + { "source": "/widgets", "destination": "https://docs.flutter.dev/ui/widgets", "type": 301 }, + { "source": "/widgets/:rest*", "destination": "https://docs.flutter.dev/ui/widgets/:rest*", "type": 301 }, + + { "source": "/catalog/samples", "destination": "https://docs.flutter.dev/reference/learning-resources", "type": 301 }, + { "source": "/chat", "destination": "https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md", "type": 302 }, + { "source": "/custom-deferred-components", "destination": "https://github.com/flutter/flutter/wiki/Deferred-Components#custom-implementations", "type": 301 }, + { "source": "/deferred-components-wiki", "destination": "https://github.com/flutter/flutter/wiki/Deferred-Components", "type": 301 }, + { "source": "/design-principles", "destination": "https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md", "type": 301 }, + { "source": "/fully-deferred-flutter", "destination": "https://github.com/flutter/flutter/wiki/Deferred-Components#fully-deferring-flutter-in-add-to-app", "type": 301 }, + { "source": "/privacy", "destination": "https://www.google.com/intl/en/policies/privacy", "type": 301 }, + { "source": "/report-jank", "destination": "https://github.com/flutter/flutter/issues/74833", "type": 301 }, + { "source": "/research-optout", "destination": "https://docs.google.com/forms/d/e/1FAIpQLSeG2Nhj0YQkr3m75P74Zb9G-v7zgNhAE9arCyig-a5B1A8uDw/viewform?usp=sf_link", "type": 301 }, + { "source": "/research-signup", "destination": "https://docs.google.com/forms/d/e/1FAIpQLSe0i4De809KXVCdljGKrjMj3lxhuzbuFKCtY5PEQPCYtGxFMg/viewform?usp=sf_link", "type": 301 }, + { "source": "/style-guide*", "destination": "https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md", "type": 301 }, + { "source": "/youtube", "destination": "https://youtube.com/flutterdev", "type": 301 }, + { "source": "/forum", "destination": "https://forum.itsallwidgets.com", "type": 301 } + ], + "headers": [ + { + "source": "/assets/*.@(jpg|jpeg|png|webp|avif|svg|mp4|css)", + "headers": [ + { + "key": "Cache-Control", + "value": "max-age=604800" + }, + { + "key": "Access-Control-Allow-Origin", + "value": "*" + } + ] + }, + { + "source": "**", + "headers": [ + { + "key": "Content-Security-Policy-Report-Only", + "value": "script-src 'self'" + }, + { + "key": "Referrer-Policy", + "value": "strict-origin-when-cross-origin" + }, + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "X-XSS-Protection", + "value": "1;mode=block" + } + ] + } + ] + }, + "emulators": { + "hosting": { + "port": 5503 + } + } +} diff --git a/sites/www/lib/builders.dart b/sites/www/lib/builders.dart new file mode 100644 index 00000000000..e74eb75a4ce --- /dev/null +++ b/sites/www/lib/builders.dart @@ -0,0 +1,9 @@ +// Copyright 2026, the Flutter authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that +// can be found in the LICENSE file. + +import 'package:build/build.dart'; + +import 'src/builders/styles_hash_builder.dart' show StylesHashBuilder; + +Builder stylesHashBuilder(BuilderOptions options) => StylesHashBuilder(options); diff --git a/sites/www/lib/main.client.dart b/sites/www/lib/main.client.dart new file mode 100644 index 00000000000..f06a08ea716 --- /dev/null +++ b/sites/www/lib/main.client.dart @@ -0,0 +1,16 @@ +// Copyright 2026, the Flutter authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that +// can be found in the LICENSE file. + +import 'package:jaspr/client.dart'; + +import 'main.client.options.dart'; +import 'src/utils/scroll_spy.dart'; + +void main() { + Jaspr.initializeApp(options: defaultClientOptions); + + ScrollNotifier.init(); + + runApp(const ClientApp()); +} diff --git a/sites/www/lib/main.client.options.dart b/sites/www/lib/main.client.options.dart new file mode 100644 index 00000000000..9858fb514df --- /dev/null +++ b/sites/www/lib/main.client.options.dart @@ -0,0 +1,138 @@ +// dart format off +// ignore_for_file: type=lint + +// GENERATED FILE, DO NOT MODIFY +// Generated with jaspr_builder + +import 'package:jaspr/client.dart'; + +import 'package:flutter_website/src/components/common/carousel.dart' + deferred as _carousel; +import 'package:flutter_website/src/components/common/newsletter_form.dart' + deferred as _newsletter_form; +import 'package:flutter_website/src/components/common/tabs.dart' + deferred as _tabs; +import 'package:flutter_website/src/components/layout/header.dart' + deferred as _header; +import 'package:flutter_website/src/components/pages/consultants_cookie_snack.dart' + deferred as _consultants_cookie_snack; +import 'package:flutter_website/src/components/pages/consultants_grid.dart' + deferred as _consultants_grid; +import 'package:flutter_website/src/components/pages/events_grid.dart' + deferred as _events_grid; +import 'package:flutter_website/src/components/pages/games_adaptive_media.dart' + deferred as _games_adaptive_media; +import 'package:flutter_website/src/components/pages/showcase_grid.dart' + deferred as _showcase_grid; +import 'package:flutter_website/src/models/content/banner_content.dart' + as _banner_content; +import 'package:flutter_website/src/utils/component_ref.dart' as _component_ref; + +/// Default [ClientOptions] for use with your Jaspr project. +/// +/// Use this to initialize Jaspr **before** calling [runApp]. +/// +/// Example: +/// ```dart +/// import 'main.client.options.dart'; +/// +/// void main() { +/// Jaspr.initializeApp( +/// options: defaultClientOptions, +/// ); +/// +/// runApp(...); +/// } +/// ``` +ClientOptions get defaultClientOptions => ClientOptions( + clients: { + 'carousel': ClientLoader( + (p) => _carousel.Carousel( + _component_ref.ComponentRef.fromId(p['items'] as String), + prevBtn: p['prevBtn'] != null + ? _component_ref.ComponentRef.fromId(p['prevBtn'] as String) + : null, + nextBtn: p['nextBtn'] != null + ? _component_ref.ComponentRef.fromId(p['nextBtn'] as String) + : null, + ), + loader: _carousel.loadLibrary, + ), + 'newsletter_form': ClientLoader( + (p) => _newsletter_form.NewsletterForm(), + loader: _newsletter_form.loadLibrary, + ), + 'tabs': ClientLoader( + (p) => _tabs.Tabs( + title: p['title'] != null + ? _component_ref.ComponentRef.fromId(p['title'] as String) + : null, + header: p['header'] != null + ? _component_ref.ComponentRef.fromId(p['header'] as String) + : null, + tabs: (p['tabs'] as List) + .map((i) => _tabs.Tab.fromMap(i as Map)) + .toList(), + noSpy: p['noSpy'] as bool, + ), + loader: _tabs.loadLibrary, + ), + 'header': ClientLoader( + (p) => _header.Header( + contrastLogoSrc: p['contrastLogoSrc'] as String, + defaultLogoSrc: p['defaultLogoSrc'] as String, + banner: _banner_content.BannerContent.fromJson( + p['banner'] as Map, + ), + pageUrl: p['pageUrl'] as String, + ), + loader: _header.loadLibrary, + ), + 'consultants_cookie_snack': ClientLoader( + (p) => _consultants_cookie_snack.ConsultantsCookieSnack(), + loader: _consultants_cookie_snack.loadLibrary, + ), + 'consultants_grid': ClientLoader( + (p) => _consultants_grid.ConsultantsGrid( + data: (p['data'] as List) + .map((i) => (i as Map)) + .toList(), + items: (p['items'] as List) + .map((i) => _component_ref.ComponentRef.fromId(i as String)) + .toList(), + ), + loader: _consultants_grid.loadLibrary, + ), + 'events_grid': ClientLoader( + (p) => _events_grid.EventsGrid( + data: (p['data'] as List) + .map((i) => (i as Map)) + .toList(), + items: (p['items'] as List) + .map((i) => _component_ref.ComponentRef.fromId(i as String)) + .toList(), + ), + loader: _events_grid.loadLibrary, + ), + 'games_adaptive_media': ClientLoader( + (p) => _games_adaptive_media.GamesAdaptiveMedia( + mobileAssets: (p['mobileAssets'] as Map) + .cast(), + desktopAssets: (p['desktopAssets'] as Map) + .cast(), + ), + loader: _games_adaptive_media.loadLibrary, + ), + 'showcase_grid': ClientLoader( + (p) => _showcase_grid.ShowcaseGrid( + data: (p['data'] as List) + .map((i) => (i as Map)) + .toList(), + items: (p['items'] as List) + .map((i) => _component_ref.ComponentRef.fromId(i as String)) + .toList(), + ), + loader: _showcase_grid.loadLibrary, + ), + }, +); diff --git a/sites/www/lib/main.server.dart b/sites/www/lib/main.server.dart new file mode 100644 index 00000000000..fc1a55341cd --- /dev/null +++ b/sites/www/lib/main.server.dart @@ -0,0 +1,180 @@ +// Copyright 2026, the Flutter authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that +// can be found in the LICENSE file. + +import 'package:jaspr/server.dart'; +import 'package:jaspr_content/jaspr_content.dart'; +import 'package:jaspr_content/theme.dart'; + +import 'main.server.options.dart'; +import 'src/components/common/image.dart'; +import 'src/layouts/consultants_tos_layout.dart'; +import 'src/layouts/default_layout.dart'; +import 'src/layouts/showcase_story_layout.dart'; +import 'src/pages/ai_page.dart'; +import 'src/pages/brand_page.dart'; +import 'src/pages/community_page.dart'; +import 'src/pages/consultants_page.dart'; +import 'src/pages/culture_page.dart'; +import 'src/pages/desktop_page.dart'; +import 'src/pages/development_page.dart'; +import 'src/pages/ecosystem_page.dart'; +import 'src/pages/embedded_page.dart'; +import 'src/pages/events_page.dart'; +import 'src/pages/flip_page.dart'; +import 'src/pages/games_page.dart'; +import 'src/pages/google_integrations_page.dart'; +import 'src/pages/home_page.dart'; +import 'src/pages/ios_page.dart'; +import 'src/pages/mobile_page.dart'; +import 'src/pages/monetization_page.dart'; +import 'src/pages/news_page.dart'; +import 'src/pages/not_found_page.dart'; +import 'src/pages/showcase_page.dart'; +import 'src/pages/web_page.dart'; +import 'src/utils/asset_utils.dart'; +import 'src/utils/component_ref.dart'; + +void main() async { + Jaspr.initializeApp(options: defaultServerOptions); + + final assetManager = AssetManager( + directory: 'content', + outputPrefix: 'assets', + assetTransformers: [ + TrackingAssetTransformer(), + ResizingAssetTransformer(), + const HashingAssetTransformer(), + ], + ); + + ServerApp.addMiddleware(assetManager.middleware); + + runApp( + ComponentRefScope( + child: ContentApp.custom( + loaders: [ + FilesystemLoader('content', filterExtensions: {'.md'}), + MemoryLoader( + pages: [ + MemoryPage.builder( + path: '404.html', + keepSuffix: true, + builder: (context) => const NotFoundPage(), + initialData: { + 'page': { + 'title': 'Not Found', + 'slug': '404', + 'bodyTags': 'interior notfound', + 'description': 'Page not found.', + }, + }, + ), + ], + ), + ], + eagerlyLoadAllPages: true, + configResolver: PageConfig.all( + dataLoaders: [ + FilesystemDataLoader('content'), + assetManager.dataLoader, + ], + parsers: [const MarkdownParser()], + extensions: [ShowcaseStoryExtension(), assetManager.pageExtension], + components: [ + CustomComponent( + pattern: 'HomePage', + builder: (_, _, _) => const HomePage(), + ), + CustomComponent( + pattern: 'DevelopmentPage', + builder: (_, _, _) => const DevelopmentPage(), + ), + CustomComponent( + pattern: 'MobilePage', + builder: (_, _, _) => const MobilePage(), + ), + CustomComponent( + pattern: 'IosPage', + builder: (_, _, _) => const IosPage(), + ), + CustomComponent( + pattern: 'WebPage', + builder: (_, _, _) => const WebPage(), + ), + CustomComponent( + pattern: 'DesktopPage', + builder: (_, _, _) => const DesktopPage(), + ), + CustomComponent( + pattern: 'EmbeddedPage', + builder: (_, _, _) => const EmbeddedPage(), + ), + CustomComponent( + pattern: 'AiPage', + builder: (_, _, _) => const AiPage(), + ), + CustomComponent( + pattern: 'GoogleIntegrationsPage', + builder: (_, _, _) => const GoogleIntegrationsPage(), + ), + CustomComponent( + pattern: 'MonetizationPage', + builder: (_, _, _) => const MonetizationPage(), + ), + CustomComponent( + pattern: 'GamesPage', + builder: (_, _, _) => const GamesPage(), + ), + CustomComponent( + pattern: 'EcosystemPage', + builder: (_, _, _) => const EcosystemPage(), + ), + CustomComponent( + pattern: 'CommunityPage', + builder: (_, _, _) => const CommunityPage(), + ), + CustomComponent( + pattern: 'EventsPage', + builder: (_, _, _) => const EventsPage(), + ), + CustomComponent( + pattern: 'CulturePage', + builder: (_, _, _) => const CulturePage(), + ), + CustomComponent( + pattern: 'ConsultantsPage', + builder: (_, _, _) => const ConsultantsPage(), + ), + CustomComponent( + pattern: 'ShowcasePage', + builder: (_, _, _) => const ShowcasePage(), + ), + CustomComponent( + pattern: 'BrandPage', + builder: (_, _, _) => const BrandPage(), + ), + CustomComponent( + pattern: 'FlipPage', + builder: (_, _, _) => const FlipPage(), + ), + CustomComponent( + pattern: 'NewsPage', + builder: (_, _, _) => const NewsPage(), + ), + CustomComponent( + pattern: 'Image', + builder: (_, attrs, _) => Image.fromAttrs(attrs), + ), + ], + layouts: [ + DefaultLayout(), + ConsultantsTosLayout(), + ShowcaseStoryLayout(), + ], + theme: const ContentTheme.none(), + ), + ), + ), + ); +} diff --git a/sites/www/lib/main.server.options.dart b/sites/www/lib/main.server.options.dart new file mode 100644 index 00000000000..5440f946cd9 --- /dev/null +++ b/sites/www/lib/main.server.options.dart @@ -0,0 +1,110 @@ +// dart format off +// ignore_for_file: type=lint + +// GENERATED FILE, DO NOT MODIFY +// Generated with jaspr_builder + +import 'package:jaspr/server.dart'; +import 'package:flutter_website/src/components/common/carousel.dart' + as _carousel; +import 'package:flutter_website/src/components/common/newsletter_form.dart' + as _newsletter_form; +import 'package:flutter_website/src/components/common/tabs.dart' as _tabs; +import 'package:flutter_website/src/components/layout/header.dart' as _header; +import 'package:flutter_website/src/components/pages/consultants_cookie_snack.dart' + as _consultants_cookie_snack; +import 'package:flutter_website/src/components/pages/consultants_grid.dart' + as _consultants_grid; +import 'package:flutter_website/src/components/pages/events_grid.dart' + as _events_grid; +import 'package:flutter_website/src/components/pages/games_adaptive_media.dart' + as _games_adaptive_media; +import 'package:flutter_website/src/components/pages/showcase_grid.dart' + as _showcase_grid; + +/// Default [ServerOptions] for use with your Jaspr project. +/// +/// Use this to initialize Jaspr **before** calling [runApp]. +/// +/// Example: +/// ```dart +/// import 'main.server.options.dart'; +/// +/// void main() { +/// Jaspr.initializeApp( +/// options: defaultServerOptions, +/// ); +/// +/// runApp(...); +/// } +/// ``` +ServerOptions get defaultServerOptions => ServerOptions( + clientId: 'main.client.dart.js', + clients: { + _carousel.Carousel: ClientTarget<_carousel.Carousel>( + 'carousel', + params: __carouselCarousel, + ), + _newsletter_form.NewsletterForm: + ClientTarget<_newsletter_form.NewsletterForm>('newsletter_form'), + _tabs.Tabs: ClientTarget<_tabs.Tabs>('tabs', params: __tabsTabs), + _header.Header: ClientTarget<_header.Header>( + 'header', + params: __headerHeader, + ), + _consultants_cookie_snack.ConsultantsCookieSnack: + ClientTarget<_consultants_cookie_snack.ConsultantsCookieSnack>( + 'consultants_cookie_snack', + ), + _consultants_grid.ConsultantsGrid: + ClientTarget<_consultants_grid.ConsultantsGrid>( + 'consultants_grid', + params: __consultants_gridConsultantsGrid, + ), + _events_grid.EventsGrid: ClientTarget<_events_grid.EventsGrid>( + 'events_grid', + params: __events_gridEventsGrid, + ), + _games_adaptive_media.GamesAdaptiveMedia: + ClientTarget<_games_adaptive_media.GamesAdaptiveMedia>( + 'games_adaptive_media', + params: __games_adaptive_mediaGamesAdaptiveMedia, + ), + _showcase_grid.ShowcaseGrid: ClientTarget<_showcase_grid.ShowcaseGrid>( + 'showcase_grid', + params: __showcase_gridShowcaseGrid, + ), + }, + styles: () => [], +); + +Map __carouselCarousel(_carousel.Carousel c) => { + 'items': c.items.toId(), + 'prevBtn': c.prevBtn?.toId(), + 'nextBtn': c.nextBtn?.toId(), +}; +Map __tabsTabs(_tabs.Tabs c) => { + 'title': c.title?.toId(), + 'header': c.header?.toId(), + 'tabs': c.tabs.map((i) => i.toMap()).toList(), + 'noSpy': c.noSpy, +}; +Map __headerHeader(_header.Header c) => { + 'contrastLogoSrc': c.contrastLogoSrc, + 'defaultLogoSrc': c.defaultLogoSrc, + 'banner': c.banner.toMap(), + 'pageUrl': c.pageUrl, +}; +Map __consultants_gridConsultantsGrid( + _consultants_grid.ConsultantsGrid c, +) => {'data': c.data, 'items': c.items.map((i) => i.toId()).toList()}; +Map __events_gridEventsGrid(_events_grid.EventsGrid c) => { + 'data': c.data, + 'items': c.items.map((i) => i.toId()).toList(), +}; +Map __games_adaptive_mediaGamesAdaptiveMedia( + _games_adaptive_media.GamesAdaptiveMedia c, +) => {'mobileAssets': c.mobileAssets, 'desktopAssets': c.desktopAssets}; +Map __showcase_gridShowcaseGrid( + _showcase_grid.ShowcaseGrid c, +) => {'data': c.data, 'items': c.items.map((i) => i.toId()).toList()}; diff --git a/sites/www/lib/src/builders/styles_hash_builder.dart b/sites/www/lib/src/builders/styles_hash_builder.dart new file mode 100644 index 00000000000..db9f3986ce3 --- /dev/null +++ b/sites/www/lib/src/builders/styles_hash_builder.dart @@ -0,0 +1,74 @@ +// Copyright 2026, the Flutter authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that +// can be found in the LICENSE file. + +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:build/build.dart'; +import 'package:collection/collection.dart'; +import 'package:crypto/crypto.dart'; +import 'package:glob/glob.dart'; + +/// Generates a content hash of SCSS source files for CSS cache busting. +/// +/// Hashes the SCSS sources rather than the compiled CSS output so that +/// the hash is stable across dev and release builds. +final class StylesHashBuilder implements Builder { + static final Glob _scssGlob = Glob('lib/styles/**.scss'); + + const StylesHashBuilder(this.options); + + final BuilderOptions options; + + @override + Map> get buildExtensions => const { + 'web/main.scss': ['lib/src/style_hash.dart'], + }; + + @override + Future build(BuildStep buildStep) async { + final String hashString; + + if (options.config['fixed_hash'] == true) { + hashString = ''; + } else { + final allBytes = BytesBuilder(copy: false); + allBytes.add(await buildStep.readAsBytes(buildStep.inputId)); + + final scssAssets = await buildStep.findAssets(_scssGlob).toList(); + + for (final asset in scssAssets.sortedBy((asset) => asset.path)) { + allBytes.add(await buildStep.readAsBytes(asset)); + } + + final digest = sha256.convert(allBytes.takeBytes()); + hashString = base64Url.encode(digest.bytes).substring(0, 12); + } + + await buildStep.writeAsString( + buildStep.allowedOutputs.single, + ''' +// Copyright 2026, the Flutter authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that +// can be found in the LICENSE file. + +/// Generated by flutter_website|stylesHashBuilder. Do not edit. +/// +/// This hash is used to cache bust the CSS file. +/// It is generated from the SCSS source files and +/// is used to ensure that the CSS file is re-generated +/// when the SCSS source files change. +/// +/// The hash is generated using the SHA-256 hash function +/// and is encoded using Base64 URL encoding. +library; + +// dart format off + +/// The generated hash of the SCSS source files. +const generatedStylesHash = '$hashString'; +''', + ); + } +} diff --git a/sites/www/lib/src/components/common/carousel.dart b/sites/www/lib/src/components/common/carousel.dart new file mode 100644 index 00000000000..ea21c841ca6 --- /dev/null +++ b/sites/www/lib/src/components/common/carousel.dart @@ -0,0 +1,236 @@ +// Copyright 2026, the Flutter authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that +// can be found in the LICENSE file. + +import 'dart:async'; + +import 'package:jaspr/dom.dart'; +import 'package:jaspr/jaspr.dart'; +import 'package:universal_web/web.dart' as web; + +import '../../utils/component_ref.dart'; +import 'icon.dart'; + +@client +class Carousel extends StatelessComponent { + const Carousel(this.items, {this.prevBtn, this.nextBtn}); + + final ComponentRef items; + final ComponentRef? prevBtn; + final ComponentRef? nextBtn; + + @override + Component build(BuildContext context) { + return CarouselBase(items, prevBtn: prevBtn, nextBtn: nextBtn); + } +} + +class CarouselBase extends StatefulComponent { + const CarouselBase(this.items, {this.prevBtn, this.nextBtn}); + + final Component items; + final Component? prevBtn; + final Component? nextBtn; + + @override + State createState() => _CarouselState(); +} + +class _CarouselState extends State { + double _progress = 0; + int _maxScroll = 0; + int _totalCards = 0; + int _cardWidth = 0; + int _currentIndex = 0; + + final GlobalNodeKey _sliderKey = GlobalNodeKey(); + StreamSubscription? _resizeSub; + + @override + void initState() { + super.initState(); + + if (kIsWeb) { + _resizeSub = web.EventStreamProviders.resizeEvent + .forTarget(web.window) + .listen((event) { + _onResize(); + }); + + _initCards(); + } + } + + @override + void didUpdateComponent(covariant CarouselBase oldComponent) { + _initCards(); + super.didUpdateComponent(oldComponent); + } + + void _initCards() { + context.binding.addPostFrameCallback(() { + final slider = _sliderKey.currentNode; + if (slider == null) { + return; + } + + _totalCards = slider.children.length; + if (_totalCards == 0) { + return; + } + + _setMaxScroll(); + + final firstCard = slider.firstElementChild! as web.HTMLElement; + final style = web.window.getComputedStyle(firstCard); + _cardWidth = + firstCard.offsetWidth + + int.parse(RegExp(r'\d+').firstMatch(style.marginRight)!.group(0)!); + + _onScroll(); + }); + } + + void _onResize() { + if (_totalCards == 0) { + return; + } + _setMaxScroll(); + _onScroll(); + } + + void _onScroll() { + final currentScroll = _getRemainingScroll(); + + setState(() { + _progress = ((currentScroll - _maxScroll).abs() / _maxScroll) * 100; + if (_maxScroll <= 0 || _progress.isNaN) { + _progress = 100; + } + }); + } + + int _getRemainingScroll() { + final slider = _sliderKey.currentNode; + if (slider == null) return 0; + final offsetLeft = slider.offsetLeft; + final scrollWidth = slider.scrollWidth; + final scrollLeft = slider.scrollLeft.floor(); + final rect = slider.getBoundingClientRect(); + final rectRight = rect.right.ceil(); + return scrollWidth - scrollLeft + offsetLeft - rectRight; + } + + void _setMaxScroll() { + final slider = _sliderKey.currentNode; + if (slider == null) { + return; + } + _maxScroll = slider.scrollWidth - slider.offsetWidth; + } + + void _navigate(bool forward) { + final slider = _sliderKey.currentNode; + if (slider == null) { + return; + } + + var idx = _currentIndex; + + // Has been scrolled manually, need to get correct idx before proceeding + if (slider.scrollLeft > 0) { + final proposedIdx = (slider.scrollLeft.ceil() / _cardWidth).floor(); + if (idx != proposedIdx) { + _currentIndex = idx = proposedIdx; + } + } + + if (forward) { + _currentIndex = idx == _totalCards - 1 ? idx : idx + 1; + var nextScrollLeft = _currentIndex * _cardWidth; + if (_maxScroll - nextScrollLeft < _cardWidth) { + nextScrollLeft = _maxScroll; + } + slider.scrollLeft = nextScrollLeft; + } else { + _currentIndex = idx == 0 ? 0 : idx - 1; + var nextScrollLeft = _currentIndex * _cardWidth; + if (nextScrollLeft < 0) { + nextScrollLeft = 0; + } + slider.scrollLeft = nextScrollLeft; + } + } + + @override + void dispose() { + if (_resizeSub case final resizeSub?) { + unawaited(resizeSub.cancel()); + } + super.dispose(); + } + + bool get _prevDisabled => _maxScroll <= 0 || _progress < 1; + bool get _nextDisabled => _maxScroll <= 0 || _progress >= 100; + + @override + Component build(BuildContext context) { + return div(classes: 'carousel', [ + div( + key: _sliderKey, + classes: 'carousel-slider', + events: {'scroll': (_) => _onScroll()}, + [component.items], + ), + div(classes: 'carousel-progress container', [ + div(classes: 'carousel-track', [ + div( + classes: 'carousel-completed', + styles: Styles(width: _progress.percent), + const [], + ), + ]), + div(classes: 'carousel-nav', [ + a( + href: '#', + classes: _prevDisabled ? 'disabled' : null, + events: { + 'click': (e) { + e.preventDefault(); + if (!_prevDisabled) { + _navigate(false); + } + }, + }, + [ + component.prevBtn ?? + const Icon( + symbol: 'arrow_circle_left', + size: .lg, + ), + ], + ), + a( + href: '#', + classes: _nextDisabled ? 'disabled' : null, + events: { + 'click': (e) { + e.preventDefault(); + if (!_nextDisabled) { + _navigate(true); + } + }, + }, + [ + component.nextBtn ?? + const Icon( + symbol: 'arrow_circle_right', + size: .lg, + ), + ], + ), + ]), + ]), + ]); + } +} diff --git a/sites/www/lib/src/components/common/feature.dart b/sites/www/lib/src/components/common/feature.dart new file mode 100644 index 00000000000..0f949eeba77 --- /dev/null +++ b/sites/www/lib/src/components/common/feature.dart @@ -0,0 +1,176 @@ +// Copyright 2026, the Flutter authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that +// can be found in the LICENSE file. + +import 'package:jaspr/dom.dart'; +import 'package:jaspr/jaspr.dart'; + +import 'icon.dart'; + +class FeatureInfo extends StatelessComponent { + const FeatureInfo({ + this.eyebrow, + this.eyebrowClass, + required this.title, + required this.description, + this.actions = const [], + super.key, + }); + + final String? eyebrow; + final String? eyebrowClass; + final String title; + final String description; + final List actions; + + @override + Component build(BuildContext context) { + return .fragment([ + Component.element( + tag: 'hgroup', + children: [ + if (eyebrow case final eyebrow?) + h4( + classes: 'eyebrow${eyebrowClass != null ? ' $eyebrowClass' : ''}', + [.text(eyebrow)], + ), + h3([.text(title)]), + ], + ), + p([.text(description)]), + if (actions.length > 1) div([...actions]) else ...actions, + ]); + } +} + +class Feature extends StatelessComponent { + Feature({ + String? eyebrow, + String? eyebrowClass, + required String title, + required String description, + List actions = const [], + this.media, + this.reverse = false, + this.noSpy = false, + this.active = false, + this.full = false, + super.key, + }) : topInfo = null, + features = [ + FeatureInfo( + eyebrow: eyebrow, + eyebrowClass: eyebrowClass, + title: title, + description: description, + actions: actions, + ), + ]; + + Feature.stacked({ + String? eyebrow, + required String title, + required this.features, + this.media, + this.reverse = false, + this.noSpy = false, + this.active = false, + this.full = false, + super.key, + }) : topInfo = FeatureInfo(eyebrow: eyebrow, title: title, description: ''); + + final FeatureInfo? topInfo; + final List features; + final Component? media; + final bool reverse; + final bool noSpy; + final bool active; + final bool full; + + @override + Component build(BuildContext context) { + Component child = div( + classes: [ + 'feature', + if (reverse) 'reverse', + if (noSpy) 'nospy', + if (active) 'active', + if (full) 'full', + ].join(' '), + [ + div(classes: 'text', [ + if (topInfo != null) + for (final feature in features) div([feature]) + else + ...features, + ]), + if (media != null) div(classes: 'media', [media!]), + ], + ); + if (topInfo case final info?) { + child = div(classes: 'stacked-feature', [ + Component.element( + tag: 'hgroup', + children: [ + if (info.eyebrow case final eyebrow?) + h4(classes: 'eyebrow', [.text(eyebrow)]), + h2( + info.title + .split('\n') + .fold( + [], + (l, t) => [...l, if (l.isNotEmpty) const br(), .text(t)], + ), + ), + ], + ), + child, + ]); + } + return child; + } +} + +class FeatureAction extends StatelessComponent { + const FeatureAction({ + super.key, + required this.label, + required this.url, + this.solid = false, + }) : link = false, + collapsed = false; + + const FeatureAction.link({ + super.key, + required this.label, + required this.url, + this.collapsed = true, + }) : link = true, + solid = false; + + final String label; + final String url; + final bool link; + final bool collapsed; + final bool solid; + + @override + Component build(BuildContext context) { + return a( + classes: [ + 'btn', + if (link) 'quiet', + if (collapsed) 'collapsed', + if (solid) 'solid', + ].join(' '), + href: url, + [ + .text(label), + if (link) ...[ + const RawText(' '), + const Icon.linkArrow(), + ], + ], + ); + } +} diff --git a/sites/www/lib/src/components/common/feature_grid.dart b/sites/www/lib/src/components/common/feature_grid.dart new file mode 100644 index 00000000000..0c8cb32cc43 --- /dev/null +++ b/sites/www/lib/src/components/common/feature_grid.dart @@ -0,0 +1,66 @@ +// Copyright 2026, the Flutter authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that +// can be found in the LICENSE file. + +import 'package:jaspr/dom.dart'; +import 'package:jaspr/jaspr.dart'; + +import 'icon.dart'; + +class FeatureGridItem extends StatelessComponent { + const FeatureGridItem({ + required this.title, + required this.description, + required this.icon, + required this.url, + }); + + final String title; + final String description; + final String icon; + final String url; + + @override + Component build(BuildContext context) { + return div([ + a(href: url, [ + img(src: icon, alt: title), + h3([ + .text(title), + const RawText(' '), + const Icon.linkArrow(large: true), + ]), + p([.text(description)]), + ]), + ]); + } +} + +class FeatureGrid extends StatelessComponent { + const FeatureGrid({ + required this.eyebrow, + required this.title, + required this.items, + super.key, + }); + + final String eyebrow; + final String title; + final List items; + + @override + Component build(BuildContext context) { + return div(classes: 'feature-grid container', [ + div(classes: 'feature-header full', [ + Component.element( + tag: 'hgroup', + children: [ + h4(classes: 'eyebrow', [.text(eyebrow)]), + h2([.text(title)]), + ], + ), + ]), + div(classes: 'feature-grid-features col-2', [...items]), + ]); + } +} diff --git a/sites/www/lib/src/components/common/filters.dart b/sites/www/lib/src/components/common/filters.dart new file mode 100644 index 00000000000..a6e1bd3ef4b --- /dev/null +++ b/sites/www/lib/src/components/common/filters.dart @@ -0,0 +1,158 @@ +// Copyright 2026, the Flutter authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that +// can be found in the LICENSE file. + +import 'package:jaspr/dom.dart'; +import 'package:jaspr/jaspr.dart'; +import 'package:universal_web/web.dart' as web; + +import 'filters_dropdown.dart'; + +class FilterType { + final String id; + final String title; + final List options; + + const FilterType(this.id, this.title, this.options); + + String optionId(String option) { + return '${id.substring(0, id.length - 1)}-${option.toLowerCase().replaceAll(' ', '-').replaceAll('&', '')}-mobile'; + } +} + +class Filters extends StatefulComponent { + const Filters({ + this.title, + required this.data, + required this.items, + required this.filters, + super.key, + }); + + final Component? title; + final List> data; + final List items; + final List filters; + + @override + State createState() => _FiltersState(); +} + +class _FiltersState extends State { + int _showItemsCount = 9; + Map> _activeFilters = {}; + + List _filteredItems = []; + + @override + void initState() { + super.initState(); + _filteredItems = component.items; + + if (kIsWeb) { + _loadFiltersFromUrl(); + _applyFilters(_activeFilters); + } + } + + void _loadFiltersFromUrl() { + final url = Uri.parse(web.window.location.href); + + for (final type in component.filters) { + final params = url.queryParameters[type.id]?.split(','); + _activeFilters[type] = params?.toSet() ?? {}; + } + } + + void _applyFilters(Map> filters) { + setState(() { + _activeFilters = filters; + }); + + final url = Uri.parse(web.window.location.href); + final newQueryParameters = {...url.queryParameters}; + + for (final type in component.filters) { + newQueryParameters.remove(type.id); + if (filters[type] case final options? when options.isNotEmpty) { + newQueryParameters[type.id] = options.join(','); + } + } + + web.window.history.replaceState( + web.window.history.state, + '', + url.replace(queryParameters: newQueryParameters).toString(), + ); + + setState(() { + _filteredItems = component.items.where(_filterItem).toList(); + }); + } + + bool _filterItem(Component item) { + if (_activeFilters.values.every((set) => set.isEmpty)) { + return true; + } + + final index = component.items.indexOf(item); + final data = component.data[index]; + + for (final type in component.filters) { + final activeOptions = _activeFilters[type] ?? {}; + + if (activeOptions.isNotEmpty) { + var dataOptions = data[type.id]; + if (dataOptions is String) { + dataOptions = dataOptions + .split(',') + .map((opt) => opt.trim()) + .toList(); + } + if (dataOptions is List) { + if (dataOptions.isEmpty) return false; + if (!dataOptions.any(activeOptions.contains)) { + return false; + } + } + } + } + + return true; + } + + @override + Component build(BuildContext context) { + return div(classes: 'container story-grid', [ + div(classes: 'story-grid-header', [ + ?component.title, + FiltersDropdown( + filters: component.filters, + activeFilters: _activeFilters, + applyFilters: _applyFilters, + ), + ]), + div(classes: 'story-grid-items', [ + for (final item in component.items) + div( + styles: + _filteredItems.contains(item) && + _filteredItems.indexOf(item) < _showItemsCount + ? null + : const Styles(display: .none), + [item], + ), + ]), + if (_filteredItems.length > _showItemsCount) + button( + classes: 'btn', + onClick: () { + setState(() { + _showItemsCount += 9; + }); + }, + const [.text('Load more')], + ), + ]); + } +} diff --git a/sites/www/lib/src/components/common/filters_dropdown.dart b/sites/www/lib/src/components/common/filters_dropdown.dart new file mode 100644 index 00000000000..5981b078dbe --- /dev/null +++ b/sites/www/lib/src/components/common/filters_dropdown.dart @@ -0,0 +1,225 @@ +// Copyright 2026, the Flutter authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that +// can be found in the LICENSE file. + +import 'dart:async'; + +import 'package:jaspr/dom.dart'; +import 'package:jaspr/jaspr.dart'; +import 'package:universal_web/web.dart' as web; + +import 'filters.dart'; +import 'icon.dart'; + +class FiltersDropdown extends StatefulComponent { + const FiltersDropdown({ + required this.filters, + required this.activeFilters, + required this.applyFilters, + super.key, + }); + + final List filters; + final Map> activeFilters; + final void Function(Map>) applyFilters; + + @override + State createState() => _FiltersDropdownState(); +} + +class _FiltersDropdownState extends State { + bool _isMobile = false; + bool _isOpen = false; + + Map> _selectedFilters = {}; + final Set _openedMobileDropdowns = {}; + + StreamSubscription? _resizeSubscription; + + @override + void initState() { + super.initState(); + + if (kIsWeb) { + _resizeSubscription = web.EventStreamProviders.resizeEvent + .forTarget(web.window) + .listen((_) => onResize()); + onResize(); + _selectedFilters = { + for (final type in component.filters) + type: {...component.activeFilters[type] ?? {}}, + }; + } + } + + void onResize() { + setState(() { + _isMobile = web.window.innerWidth < 768; + }); + } + + void toggleDropdown() { + setState(() { + _isOpen = !_isOpen; + if (_isMobile) { + _openedMobileDropdowns.clear(); + } + }); + + if (_isMobile && _isOpen) { + web.document.body!.style.overflow = 'hidden'; + } else { + web.document.body!.style.overflow = 'auto'; + } + } + + void applyFilters() { + component.applyFilters(_selectedFilters); + + toggleDropdown(); + } + + void clearAllFilters() { + setState(() { + _selectedFilters = {for (final type in component.filters) type: {}}; + }); + + applyFilters(); + } + + void toggleMobileDropdown(FilterType type) { + setState(() { + if (_openedMobileDropdowns.contains(type)) { + _openedMobileDropdowns.remove(type); + } else { + _openedMobileDropdowns.add(type); + } + }); + } + + @override + void dispose() { + if (_resizeSubscription case final resizeSubscription?) { + unawaited(resizeSubscription.cancel()); + } + super.dispose(); + } + + @override + Component build(BuildContext context) { + final filtersCount = component.activeFilters.values.fold( + 0, + (acc, set) => acc + set.length, + ); + + return div(classes: 'dropdown', [ + button( + classes: [ + 'btn top-level filters-dropdown__button', + if (_isMobile) 'mobile-button', + if (filtersCount > 0) 'primary', + ].join(' '), + onClick: toggleDropdown, + [ + const .text('Filters '), + if (filtersCount > 0) + div([ + const .text('('), + span([.text('$filtersCount')]), + const .text(')'), + ]) + else + const Icon( + symbol: 'expand_more', + size: .md, + ), + ], + ), + if (_isOpen) + div( + classes: [ + 'filters-dropdown-content', + 'show', + if (_isMobile) 'mobile-open', + ].join(' '), + [ + div( + classes: [ + 'filters-dropdown__mobile-header', + if (_isMobile) 'show', + ].join(' '), + [ + const span([.text('Filters')]), + span(events: events(onClick: toggleDropdown), const [ + Icon(symbol: 'close'), + ]), + ], + ), + div(classes: 'filters-dropdown__filters-container', [ + for (final type in component.filters) ...[ + _buildFilterGroup(type), + const span(classes: 'separator', []), + ], + ]), + div(classes: 'filters-dropdown__buttons-container', [ + button( + classes: 'btn filters-dropdown__clear-all-button', + onClick: clearAllFilters, + const [.text('Clear All')], + ), + button(classes: 'btn', onClick: applyFilters, const [ + .text('Apply'), + ]), + ]), + ], + ), + ]); + } + + Component _buildFilterGroup(FilterType type) { + return div([ + span( + classes: [ + 'filter-title', + if (_openedMobileDropdowns.contains(type)) 'selected', + ].join(' '), + events: events(onClick: () => toggleMobileDropdown(type)), + [ + .text(type.title), + const Icon( + symbol: 'expand_more', + size: .md, + ), + ], + ), + div( + classes: [ + 'filters-dropdown__checkbox-container', + if (_openedMobileDropdowns.contains(type)) 'show', + ].join(' '), + [ + for (final option in type.options) + label(htmlFor: type.optionId(option), [ + input( + id: type.optionId(option), + type: InputType.checkbox, + value: option, + checked: _selectedFilters[type]?.contains(option) ?? false, + onChange: (bool? value) { + setState(() { + final options = _selectedFilters[type] ??= {}; + if (value ?? false) { + options.add(option); + } else { + options.remove(option); + } + }); + }, + ), + .text(option), + ]), + ], + ), + ]); + } +} diff --git a/sites/www/lib/src/components/common/icon.dart b/sites/www/lib/src/components/common/icon.dart new file mode 100644 index 00000000000..1b74627e0ac --- /dev/null +++ b/sites/www/lib/src/components/common/icon.dart @@ -0,0 +1,71 @@ +// Copyright 2026, the Flutter authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that +// can be found in the LICENSE file. + +import 'package:jaspr/dom.dart'; +import 'package:jaspr/jaspr.dart'; + +/// A Material Symbols icon as a `span`. +class Icon extends StatelessComponent { + const Icon({ + required this.symbol, + this.label, + this.size = IconSize.md, + this.filled = false, + this.classes, + super.key, + }); + + const Icon.linkArrow({bool large = false}) + : this( + symbol: 'arrow_forward', + size: large ? .sm : .xs, + classes: const ['link-arrow-icon'], + ); + + /// The ID of the Material Symbol to use. + final String symbol; + + /// The label to use for accessibility. + /// + /// If not specified, the icon is marked as hidden from screen readers. + final String? label; + + /// The size of the icon. + final IconSize size; + + /// Whether the icon is filled. + final bool filled; + + /// Extra classes to apply to the icon's span. + final List? classes; + + @override + Component build(BuildContext context) { + return span( + classes: [ + 'icon', + 'material-symbols-rounded', + 'notranslate', + 'icon-${size.name}', + if (filled) 'icon-filled', + ...?classes, + ].join(' '), + attributes: { + if (label case final label?) + 'aria-label': label + else + 'aria-hidden': 'true', + 'translate': 'no', + }, + [.text(symbol)], + ); + } +} + +enum IconSize { + xs, + sm, + md, + lg, +} diff --git a/sites/www/lib/src/components/common/image.dart b/sites/www/lib/src/components/common/image.dart new file mode 100644 index 00000000000..da76fdff8a8 --- /dev/null +++ b/sites/www/lib/src/components/common/image.dart @@ -0,0 +1,45 @@ +// Copyright 2026, the Flutter authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that +// can be found in the LICENSE file. + +import 'package:jaspr/dom.dart'; +import 'package:jaspr/server.dart'; + +import '../../utils/asset_utils.dart'; + +class Image extends StatelessComponent { + const Image({ + super.key, + required this.src, + this.alt, + this.fullWidth = false, + this.rounded = false, + }); + + factory Image.fromAttrs(Map attrs) { + return Image( + src: attrs['src'] as String, + alt: attrs['alt'] as String, + fullWidth: attrs['format'] == 'fullwidth', + rounded: attrs['rounded'] == 'true' || attrs['rounded'] == true, + ); + } + + final String src; + final String? alt; + final bool fullWidth; + final bool rounded; + + @override + Component build(BuildContext context) { + return img( + src: context.asset(src, width: 800), + classes: [ + 'richtext-image', + if (fullWidth) 'full-width', + if (rounded) 'rounded', + ].join(' '), + alt: alt, + ); + } +} diff --git a/sites/www/lib/src/components/common/newsletter_form.dart b/sites/www/lib/src/components/common/newsletter_form.dart new file mode 100644 index 00000000000..58eca36fb10 --- /dev/null +++ b/sites/www/lib/src/components/common/newsletter_form.dart @@ -0,0 +1,410 @@ +// Copyright 2026, the Flutter authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that +// can be found in the LICENSE file. + +import 'dart:async'; +import 'dart:convert'; + +import 'package:http/http.dart' as http; +import 'package:jaspr/dom.dart'; +import 'package:jaspr/jaspr.dart'; +import 'package:universal_web/js_interop.dart'; +import 'package:universal_web/web.dart' as web; + +import '../../utils/countries.dart'; +import 'icon.dart'; + +@client +class NewsletterForm extends StatefulComponent { + const NewsletterForm({super.key}); + + @override + State createState() => _NewsletterFormState(); +} + +class _NewsletterFormState extends State { + // State variables + bool _submitted = false; + bool _focused = false; + Map _errors = {}; + + // Form fields + String _email = ''; + String _firstName = ''; + String _lastName = ''; + String _country = ''; + bool _optin = false; + + // Constants from Alpine.js implementation + static const String _formUrl = + 'https://services.google.com/fb/submissions/fluttersubscribe/'; + static const String _recaptchaSiteKey = + '6LdG504kAAAAAPZGIhZd_--CkTASNKaW64oMriCL'; + + static const Map _errorMessages = { + 'email': 'Please enter a valid email address', + 'first_name': 'Please enter a valid first name', + 'last_name': 'Please enter a valid last name', + 'country': 'Please select your country', + 'optin': 'You must agree to subscribe', + 'captcha': 'You must solve the captcha', + }; + + static const Map _payloadFieldsMap = { + 'email': 'EmailAddress', + 'first_name': 'FirstName', + 'last_name': 'LastName', + 'country': 'Country', + 'optin': 'FlutterDevUpdates', + }; + + void onFocus() { + setState(() => _focused = true); + + context.binding.addPostFrameCallback(() { + final elem = web.document.getElementById('g-recaptcha')!; + grecaptcha.render( + elem, + ReCaptchaRenderOptions(sitekey: _recaptchaSiteKey), + ); + }); + } + + bool _validateEmail(String email) { + if (email.isEmpty) return false; + final emailRegex = RegExp(r'^[^\s@]+@[^\s@]+\.[^\s@]+$'); + return emailRegex.hasMatch(email); + } + + bool _validate() { + final newErrors = {}; + + // Validate email + if (!_validateEmail(_email)) { + newErrors['email'] = _errorMessages['email']!; + } + + // Validate first name + if (_firstName.isEmpty) { + newErrors['first_name'] = _errorMessages['first_name']!; + } + + // Validate last name + if (_lastName.isEmpty) { + newErrors['last_name'] = _errorMessages['last_name']!; + } + + // Validate country + if (_country.isEmpty) { + newErrors['country'] = _errorMessages['country']!; + } + + // Validate optin + if (!_optin) { + newErrors['optin'] = _errorMessages['optin']!; + } + + // Validate captcha + // alpine-js: var response = grecaptcha.getResponse(); if (response.length == 0) + + final response = grecaptcha.getResponse(); + if (response.isEmpty) { + newErrors['captcha'] = _errorMessages['captcha']!; + } + + setState(() { + _errors = newErrors; + }); + + return newErrors.isEmpty; + } + + void _onSubmit(web.Event event) { + event.preventDefault(); + + setState(() { + _errors = {}; + }); + + if (_validate()) { + unawaited(_sendData()); + } + } + + Future _sendData() async { + try { + // Create multipart request for form submission + final request = http.MultipartRequest('POST', Uri.parse(_formUrl)); + + request.fields['EmailAddress'] = _email; + request.fields['FirstName'] = _firstName; + request.fields['LastName'] = _lastName; + request.fields['Country'] = _country; + request.fields['FlutterDevUpdates'] = _optin.toString(); + request.fields['LanguagePreference'] = 'en-US'; + + final streamedResponse = await request.send(); + final response = await http.Response.fromStream(streamedResponse); + + if (response.statusCode == 200) { + final jsonData = jsonDecode(response.body); + + if (jsonData case {'errors': final Map serverErrors}) { + _reverseSetErrors(serverErrors); + } else { + setState(() { + _submitted = true; + }); + } + } else { + setState(() { + _errors['unknown'] = '__unknown__'; + }); + } + } catch (e) { + setState(() { + _errors['unknown'] = '__unknown__'; + }); + } + } + + void _reverseSetErrors(Map serverErrors) { + final newErrors = {}; + final keys = _payloadFieldsMap.keys.toList(); + + serverErrors.forEach((key, value) { + if (key != 'LanguagePreference') { + for (var i = 0; i < keys.length; i++) { + if (_payloadFieldsMap[keys[i]] == key) { + newErrors[keys[i]] = _errorMessages[keys[i]]!; + break; + } + } + } + }); + + setState(() { + _errors = newErrors; + }); + } + + @override + Component build(BuildContext context) { + return form( + events: {'submit': _onSubmit}, + [ + fieldset([ + if (!_submitted) + div([ + const h3([ + .text( + 'Keep up with the latest Flutter news, releases, and more:', + ), + ]), + div(classes: 'global-error', [ + if (_errors.containsKey('unknown')) + const span(classes: 'error', [ + .text( + 'There was an unknown error submitting your data. Please try again.', + ), + ]), + ]), + // Email field + div(classes: 'field-wrapper', [ + div( + classes: + 'field ${_errors.containsKey('email') ? 'error' : ''}', + [ + const Icon(symbol: 'mail', size: .lg), + const label(htmlFor: 'email', classes: 'hidden', [ + .text('Email'), + ]), + input( + type: InputType.email, + name: 'email', + id: 'email', + attributes: const { + 'placeholder': 'Enter your email address', + }, + onInput: (String value) { + setState(() => _email = value); + }, + events: { + 'focus': (_) { + onFocus(); + }, + }, + ), + ], + ), + if (_errors.containsKey('email')) + span(classes: 'error', [.text(_errors['email']!)]), + ]), + if (_focused) + div(classes: 'hidden-fields active', [ + // Name fields grid + div(classes: 'field-grid', [ + div(classes: 'field-wrapper', [ + div( + classes: + 'field ${_errors.containsKey('first_name') ? 'error' : ''}', + [ + const label(htmlFor: 'firstname', classes: 'hidden', [ + .text('First name'), + ]), + input( + type: InputType.text, + name: 'firstname', + id: 'firstname', + attributes: const {'placeholder': 'First name'}, + onInput: (String value) { + setState(() => _firstName = value); + }, + ), + ], + ), + if (_errors.containsKey('first_name')) + span(classes: 'error', [.text(_errors['first_name']!)]), + ]), + div(classes: 'field-wrapper', [ + div( + classes: + 'field ${_errors.containsKey('last_name') ? 'error' : ''}', + [ + const label(htmlFor: 'lastname', classes: 'hidden', [ + .text('Last name'), + ]), + input( + type: InputType.text, + name: 'lastname', + id: 'lastname', + attributes: const {'placeholder': 'Last name'}, + onInput: (String value) { + setState(() => _lastName = value); + }, + ), + ], + ), + if (_errors.containsKey('last_name')) + span(classes: 'error', [.text(_errors['last_name']!)]), + ]), + ]), + // Country field + div(classes: 'field-wrapper', [ + div( + classes: + 'field ${_errors.containsKey('country') ? 'error' : ''}', + [ + const label(htmlFor: 'country', classes: 'hidden', [ + .text('Country'), + ]), + select( + name: 'countries', + id: 'country', + onChange: (values) { + setState(() => _country = values.first); + }, + [ + const option( + value: '', + disabled: true, + selected: true, + [.text('Country')], + ), + for (final MapEntry( + key: countryCode, + value: countryName, + ) + in countryNameByCode.entries) + option(value: countryCode, [.text(countryName)]), + ], + ), + ], + ), + if (_errors.containsKey('country')) + span(classes: 'error', [.text(_errors['country']!)]), + ]), + // Opt-in checkbox + div(classes: 'field-wrapper', [ + div(classes: 'checkbox opt-in', [ + div( + classes: + 'field ${_errors.containsKey('optin') ? 'error' : ''}', + [ + input( + type: InputType.checkbox, + name: 'optin', + id: 'optin', + onChange: (bool? value) { + setState(() => _optin = value ?? false); + }, + ), + ], + ), + const label(htmlFor: 'optin', classes: 'optin', [ + .text( + 'By using this service, you agree to be bound by our ', + ), + a(href: 'https://policies.google.com/terms', [ + .text('Google Terms of Service'), + ]), + .text( + '. I acknowledge that the information provided in this form will be subject to ', + ), + a(href: 'https://policies.google.com/privacy', [ + .text("Google's Privacy Policy"), + ]), + .text('.'), + ]), + ]), + if (_errors.containsKey('optin')) + span(classes: 'error', [.text(_errors['optin']!)]), + ]), + // reCAPTCHA + div(classes: 'captcha-container field-wrapper', [ + div( + id: 'g-recaptcha', + classes: _errors.containsKey('captcha') ? 'error' : '', + const [], + ), + if (_errors.containsKey('captcha')) + span(classes: 'error', [.text(_errors['captcha']!)]), + ]), + // Submit button + const div([ + input( + type: InputType.submit, + classes: 'btn primary', + attributes: {'value': 'Subscribe'}, + ), + ]), + ]), + ]), + if (_submitted) + const div(classes: 'success', [ + h3([.text("You're in!")]), + p([ + .text( + 'You have successfully signed up for the latest Flutter updates and announcements.', + ), + ]), + ]), + ]), + ], + ); + } +} + +@JS() +external ReCaptcha get grecaptcha; + +extension type ReCaptcha(JSObject _value) implements JSObject { + external String getResponse(); + + external JSAny? render(JSObject container, ReCaptchaRenderOptions options); +} + +@anonymous +extension type ReCaptchaRenderOptions._(JSObject _value) implements JSObject { + external factory ReCaptchaRenderOptions({String? sitekey}); +} diff --git a/sites/www/lib/src/components/common/tabs.dart b/sites/www/lib/src/components/common/tabs.dart new file mode 100644 index 00000000000..61a651632f2 --- /dev/null +++ b/sites/www/lib/src/components/common/tabs.dart @@ -0,0 +1,86 @@ +// Copyright 2026, the Flutter authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that +// can be found in the LICENSE file. + +import 'package:jaspr/dom.dart'; +import 'package:jaspr/jaspr.dart'; + +import '../../utils/component_ref.dart'; + +class Tab { + Tab({required this.label, required this.content}); + + final String label; + final ComponentRef content; + + @decoder + static Tab fromMap(Map map) { + return Tab( + label: map['label'] as String, + content: ComponentRef.fromId(map['content'] as String), + ); + } + + @encoder + Map toMap() { + return {'label': label, 'content': content.toId()}; + } +} + +@client +class Tabs extends StatefulComponent { + const Tabs({ + this.title, + this.header, + required this.tabs, + this.noSpy = false, + super.key, + }); + + final ComponentRef? title; + final ComponentRef? header; + final List tabs; + final bool noSpy; + + @override + State createState() => _TabsState(); +} + +class _TabsState extends State { + int _activeTab = 0; + + @override + Component build(BuildContext context) { + return div(classes: 'tabs container', [ + ?component.title, + div(classes: 'tabs-header', [ + ?component.header, + div(classes: 'tabs-menu', [ + ul(classes: 'tabs-wrapper', [ + for (final (index, tab) in component.tabs.indexed) + li( + classes: 'btn ${index == _activeTab ? 'active' : ''}', + events: events( + onClick: () { + setState(() => _activeTab = index); + }, + ), + [.text(tab.label)], + ), + ]), + ]), + ]), + div(classes: 'tabs-content', [ + for (final (index, tab) in component.tabs.indexed) + div( + classes: [ + 'tab-content', + if (component.noSpy) 'no-spy', + if (index == _activeTab) 'active', + ].join(' '), + [tab.content], + ), + ]), + ]); + } +} diff --git a/sites/www/lib/src/components/common/video_carousel.dart b/sites/www/lib/src/components/common/video_carousel.dart new file mode 100644 index 00000000000..fc0a7ee186e --- /dev/null +++ b/sites/www/lib/src/components/common/video_carousel.dart @@ -0,0 +1,143 @@ +// Copyright 2026, the Flutter authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that +// can be found in the LICENSE file. + +import 'package:jaspr/dom.dart'; +import 'package:jaspr/jaspr.dart'; + +import '../../models/video.dart'; +import '../../utils/component_ref.dart'; +import 'carousel.dart'; + +class VideoCarousel extends StatelessComponent { + const VideoCarousel({required this.videos, super.key}); + + final List