Deployment
web, Google Play, App Store.
Build TIDE for release and publish it. There is no server to deploy: you ship the app, and optionally a web build and a config file on any static host.
01Version numbers
The version is in pubspec.yaml: version: 1.0.0+1. The part before + is what users see; the number after it is the build number. Raise the build number for every store upload, for example 1.0.1+2.
02Web
flutter build web --release --no-web-resources-cdn \
--dart-define=TIDE_HOST=<your-host> \
--dart-define=TIDE_CONFIG_URL=https://<your-host>/tide-config.json
The result is in build/web/. Upload the contents of that folder to any static host (your own server, Netlify, Vercel, Cloudflare Pages, Firebase Hosting; hosting is billed by your provider). Send every unknown path to index.html so the single-page app handles its own routes; deploy/vercel/vercel.json in the source is a ready example for Vercel (copy it into build/web/). This build was run for these docs with Flutter 3.41.4 and finished without errors. The \ line breaks are for macOS and Linux shells; in Windows PowerShell put the command on one line.
A browser has no Keychain or Keystore, so before a wallet is created or imported on the web the user chooses a vault passphrase (10 characters or more). PBKDF2-HMAC-SHA256 with 600,000 iterations turns it into the keys that seal the vault; the passphrase and those keys are never stored. Each new tab opens on an unlock screen, and the passphrase is asked again before the recovery phrase is shown and before every signature. A forgotten passphrase cannot be recovered: the user removes the wallet from the browser and imports the recovery phrase again. web/index.html carries a Content-Security-Policy without 'unsafe-inline' or 'unsafe-eval'. A malicious browser extension or an infected computer can still read what is typed, so recommend the phone apps for larger balances. On the web build, SPL token balances also need your own RPC endpoint (why).
03Google Play
- Set your application ID and upload keySee Rebranding and Installation → Signing. Play refuses debug-signed uploads.
- Build the app bundle
The file isflutter build appbundle --release --dart-define=TIDE_HOST=<your-host> --dart-define=TIDE_CONFIG_URL=<config-url>build/app/outputs/bundle/release/app-release.aab. - UploadPlay Console → your app → Testing or Production → Create release → upload the
.aab. - Complete the listingData safety, content rating, privacy policy URL, and the declarations Play asks for crypto wallet apps.
The appbundle build was not run for these docs (unverified on this machine); it is the standard Flutter command.
04App Store
- Register the bundle IDIn your Apple Developer account (organisation enrolment), under Identifiers.
- Pick your Team in XcodeOpen
ios/Runner.xcworkspace→ Runner → Signing & Capabilities. - Build the archive
The result is influtter build ipa --release --dart-define=TIDE_HOST=<your-host> --dart-define=TIDE_CONFIG_URL=<config-url>build/ios/ipa/. - UploadWith Apple's Transporter app, or from Xcode → Window → Organizer → Distribute App. Then test through TestFlight before you submit for review.
The ipa build was not run for these docs (unverified on this machine); it is the standard Flutter command.
05After release
- In your operator build with the same
TIDE_CONFIG_URL, Operator panel → In force right now shows the values coming from Remote document. - Run one small swap and check App fee on the confirm sheet and the fee in your wallet.
- Settings → About shows no fee warning.
- For an important fix, set Minimum app version once the new version is live in the stores.