The batteries-included reference app for the fluttersdk magic ecosystem: a
working Flutter application built on magic, magic_starter, and the
Wind design-first component system, meant to be forked into a new product
rather than read as a tutorial.
The committed pubspec.yaml is a clean hosted dependency set: every sibling
package (magic, magic_deeplink, magic_notifications, magic_social_auth,
magic_starter, magic_devtools, fluttersdk_dusk, fluttersdk_telescope,
fluttersdk_artisan) is a normal ^ caret constraint pointing at pub.dev, not
a path dependency. That is deliberate: a fork copied outside this workspace
must resolve on its own. Local, in-workspace development instead uses the
gitignored pubspec_overrides.yaml, which redirects those same packages to
the sibling checkouts under ../magic, ../magic_starter, and so on; it
never ships and is not part of the fork.
Follow these steps in order; each one depends on the previous.
- Rename the package. Update
name:inpubspec.yaml, then rename every Dartimport 'package:magic_example/...'underlib/andtest/to the new package name. Update the platform bundle identifiers too:android/app/build.gradle.kts(namespaceandapplicationId, currentlycom.fluttersdk.magic_example) and the iOSPRODUCT_BUNDLE_IDENTIFIERentries inios/Runner.xcodeproj/project.pbxproj(currentlycom.fluttersdk.magicExample). - Edit
.env. SetAPP_NAMEand pointAPI_URLat the new backend, then runmagic key:generateif the app uses theCryptfacade..envis COMMITTED here and bundled as a Flutter asset inpubspec.yaml, which is deliberate on both counts:flutter_dotenvcan only load it on web when it is a bundled asset, and a bundled asset that does not exist failsflutter build, so gitignoring it would make every fresh clone of this template unbuildable. It holds public client values only. A Flutter bundle ships to every user's device and can be read out of it, so real secrets belong on the backend, never here..env.examplestays as the key list. - Set bundle ids and app icons. Reuse the identifiers you set in step 1
for the platform bundle/app ids, then replace the launcher icons under
android/app/src/main/res/mipmap-*andios/Runner/Assets.xcassets/AppIcon.appiconset/. - Edit
DESIGN.md, then regenerate the theme:dart run bin/dispatcher.dart design:sync. This rewriteslib/config/wind_theme.g.dart; never hand-edit that file. - Delete
pubspec_overrides.yaml. It exists only to wire this app to sibling packages under active development inside thefluttersdkworkspace; a fork living outside that workspace has no sibling checkouts to point at and must resolve everymagicpackage from pub.dev via the plainpubspec.yamlconstraints. Deleting it (it is gitignored, so it was never committed) is what makesflutter pub getresolve purely hosted. - Refresh the preview catalog:
dart run bin/dispatcher.dart previews:refresh.
After these six steps, flutter pub get should resolve against pub.dev alone,
flutter analyze and flutter test should stay clean, and /preview in a
debug build should reflect the new DESIGN.md.
flutter run -d chrome, or drive it throughfluttersdk_duskfor agent/CI-style E2E.- Component and design tooling runs through
bin/dispatcher.dart:make:component,design:sync,design:lint,previews:refresh. SeeCLAUDE.mdfor the full command list and.claude/rules/design.mdfor the component contract.