Deployment
web, Android, iOS.
The web build is a static folder that any host can serve: no server, no build step on the host, no runtime backend. Store builds follow the normal Flutter process.
01Web (static hosting)
The flutter and git commands on this page are the same in Windows PowerShell. Put a command whose lines end in \ on one line (or end each line with a backtick `), and run any other shell command from Git Bash or WSL.
- Build
Output:flutter build web --release \ --dart-define=SOLSCOPE_RPC_URL=https://<your-browser-usable-rpc> \ --dart-define=SOLSCOPE_ADMIN_CONFIG_URL=https://<your-host>/solscope.jsonbuild/web/. - Upload
build/web/To Netlify, Cloudflare Pages, Vercel, Firebase Hosting, GitHub Pages, S3 or nginx. Nothing runs on the host. - Check it in a browserOpen the site, open developer tools, and confirm the console and network tabs are clean. The status bar shows which RPC is active.
This build has no SOLSCOPE_OPERATOR_PASSCODE, so it has no Setup tab: that is the one to publish. web/index.html carries a Content-Security-Policy with no 'unsafe-inline' or 'unsafe-eval'; if you add a script, a font or an analytics tag from another host, add that host to the policy, or the browser blocks it (the console says which directive).
The RPC must answer browser requests (CORS). api.mainnet-beta.solana.com returns HTTP 403 to any request with an Origin header, so it cannot serve a web build. Never put a secret API key into a public web build: it is readable in main.dart.js. Use an origin-restricted endpoint.
02A public demo of your own
flutter build web --release \
--dart-define=SOLSCOPE_DEMO=true \
--dart-define=SOLSCOPE_OPERATOR_PASSCODE=<a passcode you publish> \
--dart-define=SOLSCOPE_RPC_URL=https://solana-rpc.publicnode.com \
--base-href /
A demo build has no wallet connectors (nothing can be signed), a read-only Setup tab (behind the passcode, which for a public demo you publish to your visitors; leave it out and the demo has no Setup tab), and one labelled placeholder fee account. It seeds no portfolio, no PnL, no alerts and no promoted rows; test/demo_mode_test.dart checks each of those. Optional: SOLSCOPE_DEMO_MINT chooses the opening token.
03Android
- Create an upload key
Keep the file and passwords safe and out of git.keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload - Wire release signingThe shipped
android/app/build.gradle.ktssigns release builds with the debug key, with a note to replace it. Createandroid/key.properties(git-ignored) and add a releasesigningConfigthat reads it, following Flutter's Android signing guide. Google Play rejects debug-signed bundles. - Build the bundle
Output:flutter build appbundle --release \ --dart-define=SOLSCOPE_FEE_BPS=<bps> \ --dart-define=SOLSCOPE_FEE_ACCOUNT=<your-token-account>build/app/outputs/bundle/release/app-release.aab. Upload it in Play Console.
Google Play: non-custodial wallets are outside the crypto exchange / custodial wallet licensing policy. Do not add custody.
04iOS
- Open the workspace
ios/Runner.xcworkspacein Xcode → Runner → Signing & Capabilities → select your Team and bundle ID. - Build
flutter build ipa --release - UploadWith Xcode Organizer or Transporter, then TestFlight and App Review.
Apple guideline 3.1.5(i): wallet apps must come from an organisation account.
The web build was built and checked for these docs. Android and iOS store builds were not run in this documentation pass (unverified).
05Documentation for your users
The status-bar Docs button opens <live host>/docs/. Set SOLSCOPE_LIVE_HOST to your own site and publish your own help page there, or the button points at the SOLSCOPE site.