SOLSCOPE docs
v1.0.0
Live demo Get help
● Ship · Web and stores

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)

On Windows

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.

  1. Build
    flutter build web --release \
      --dart-define=SOLSCOPE_RPC_URL=https://<your-browser-usable-rpc> \
      --dart-define=SOLSCOPE_ADMIN_CONFIG_URL=https://<your-host>/solscope.json
    Output: build/web/.
  2. Upload build/web/To Netlify, Cloudflare Pages, Vercel, Firebase Hosting, GitHub Pages, S3 or nginx. Nothing runs on the host.
  3. 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).

Browser-usable RPC

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

  1. Create an upload key
    keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload
    Keep the file and passwords safe and out of git.
  2. Wire release signingThe shipped android/app/build.gradle.kts signs release builds with the debug key, with a note to replace it. Create android/key.properties (git-ignored) and add a release signingConfig that reads it, following Flutter's Android signing guide. Google Play rejects debug-signed bundles.
  3. Build the bundle
    flutter build appbundle --release \
      --dart-define=SOLSCOPE_FEE_BPS=<bps> \
      --dart-define=SOLSCOPE_FEE_ACCOUNT=<your-token-account>
    Output: 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

  1. Open the workspaceios/Runner.xcworkspace in Xcode → Runner → Signing & Capabilities → select your Team and bundle ID.
  2. Build
    flutter build ipa --release
  3. UploadWith Xcode Organizer or Transporter, then TestFlight and App Review.

Apple guideline 3.1.5(i): wallet apps must come from an organisation account.

Verification status

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.