Muse AI docs
v2.0.0
Live demoConsole demo Get help
● Start · Step by step

Installation.
Firebase, backend, console, first key, app.

Do these steps in order. Each one ends with a check, so you know it worked before you move on. Plan about an hour the first time, plus the waiting time for Google to enable billing. You click through web consoles and paste commands; no coding is needed.

1 Firebase project2 Deploy the backend3 Start the console4 First AI key5 Run the app6 Optional modules

01Step 1 · Create the Firebase project

Firebase is Google's service that hosts the backend, the database, file storage, sign-in and push messages. You create one project for your app in your own Google account. Menu names below are those of the Firebase console in October 2026; Google moves items now and then, so if a name differs, use the search box at the top of the Firebase console.

  1. Create a projectOpen console.firebase.google.com, sign in with your Google account → Create a project (or Add project). Type a name, accept the terms, Continue. Google Analytics is not needed: switch it off and click Create project, then Continue.
  2. Switch to the Blaze planIn the left menu at the bottom, click the plan name ("Spark") → Upgrade → Blaze → choose or create a Cloud Billing account (card details) → Continue. Cloud Functions, Cloud Scheduler and calls to AI providers do not run on the free Spark plan. Blaze bills your own Google account for your usage (Costs); set a budget alert when asked.
  3. AuthenticationLeft menu → Build → Authentication (in some layouts Security → Authentication) → Get started → tab Sign-in method → Add new provider:
    • Anonymous → Enable → Save. Required: every user gets an anonymous account first.
    • Google (optional) → Enable → pick a project support e-mail → Save. On Android it also needs your signing key fingerprints (Release); on iOS it needs the REVERSED_CLIENT_ID URL scheme in Info.plist (Release → iOS sign-in).
    • Apple (optional) → Enable → Save. For the iOS app this is enough together with the Sign in with Apple capability in Xcode; for the web build Apple also needs a Services ID and key (Apple Developer → Certificates, Identifiers & Profiles).
    • Email/Password (optional) → Enable the first switch → Save.
  4. FirestoreLeft menu → Build → Firestore Database (or Databases & Storage → Firestore) → Create database → Standard edition if asked, Database ID (default), choose a location close to your users (it cannot be changed later) → Start in production mode → Create. The deploy in step 2 installs the real security rules.
  5. StorageLeft menu → Build → Storage → Get started → production mode → same location → Done. Generated images and AI videos are stored there.
  6. Cloud MessagingNothing to switch on for Android. For iOS push, upload your APNs key later (Release).

Check: the project shows "Blaze" in the left menu, and Authentication → Sign-in method lists Anonymous as Enabled.

02Step 2 · Deploy the backend

This uploads the API to your Firebase project. In a terminal, from the source/ folder of the download:

npm i -g firebase-tools        # once
firebase login                 # opens the browser: sign in with the same Google account
cd firebase
firebase use --add             # pick your project; writes .firebaserc
cd functions && npm ci && cd ..
firebase deploy --only firestore:rules,firestore:indexes,storage,functions

Terminal: macOS or Linux as shown; on Windows use WSL or Git Bash (how).

  • Region. The default is us-central1. To use another region, before deploying copy functions/.env.example to functions/.env and set FUNCTIONS_REGION (for example europe-west1). Use the same region in the app's API_BASE_URL.
  • The deploy prints the URL of the api function. Your API_BASE_URL is that address, usually https://us-central1-<your-project-id>.cloudfunctions.net/api, with no slash at the end.
  • The first deploy enables the Google Cloud APIs it needs, which can take a few minutes. If the CLI asks to enable an API, answer yes.

Allow signed download links

The API gives the app a signed download link for each generated image and video. Google needs one permission for that:

  1. Enable the APIOpen console.cloud.google.com, pick the same project at the top → APIs & Services → Library → search "IAM Service Account Credentials API" → Enable.
  2. Grant the roleIAM & Admin → Service accounts → click <project-number>-compute@developer.gserviceaccount.com (the account 2nd gen functions run as) → tab Permissions (or Principals with access) → Grant access → New principals: the same e-mail address → role Service Account Token Creator → Save.

Without it chat works, but image generation answers 500 internal (Troubleshooting).

Check:

curl https://us-central1-<your-project-id>.cloudfunctions.net/api/v1/health

Terminal: macOS or Linux as shown; on Windows use WSL or Git Bash (how).

Expected: {"ok":true,"version":"2.0.0","ai":"no_key","images":"no_key","tts":"off","transcribe":"off","video":"off","discover":"off","demo":false,…}. no_key and off are right at this point: no provider key is set and every paid module ships off.

03Step 3 · Start the operator console

  1. Get a service-account keyFirebase console → gear icon → Project settings → tab Service accounts → Firebase Admin SDK → Generate new private key → Generate key. A JSON file downloads. Save it outside the project folder and never commit or share it: it gives full access to your project.
  2. Configure
    cd admin
    npm ci
    cp .env.example .env
    openssl rand -hex 32           # copy the output into ADMIN_SECRET_KEY

    Terminal: macOS or Linux as shown; on Windows use WSL or Git Bash (how).

    Open .env in a text editor and set ADMIN_SECRET_KEY (the 64 characters you just generated) and GOOGLE_APPLICATION_CREDENTIALS (the full path of the JSON file). Every variable is explained in Configuration. Back up ADMIN_SECRET_KEY now: it encrypts the keys you will store (why).
  3. Start
    npm start

    Terminal: macOS or Linux as shown; on Windows use WSL or Git Bash (how).

    The log shows Muse AI console http://localhost:8790/admin, data: Firestore (service account), a one-time setup code, and config/public + config/private v<n> written (the number goes up with every save).
  4. Create the ownerOpen http://localhost:8790/admin, enter the setup code, your e-mail and a password of 12 or more characters. Each start before an owner exists prints a new code; any printed code works.
  5. Turn on two-factorSecurity & alerts → Set up two-factor. The owner can set keys, so protect the account.
Create the owner form with setup code, e-mail, password and repeat password fields
First start · Create the owner

Running the console on a server instead of your computer: Deployment.

04Step 4 · Add your first AI key and enable a model

  1. Legal firstConsole → Legal: enter your Terms of service URL and Privacy policy URL. Save changes.
  2. Get a keyCreate an API key in your provider's dashboard; the click path for each provider is in Provider dashboards. The provider bills your own account for your usage.
  3. Paste the keyConsole → AI providers & keys → Anthropic API key → Set, paste the key, then Save changes at the bottom. (Or OpenAI, Gemini, or a compatible endpoint: AI providers and models.)
  4. Test itClick Test connection. A good key answers "Anthropic accepted the key. … models available. Catalog models found: …". A wrong key answers "Connection failed. Anthropic refused the API key (401)."
  5. Enable a modelConsole → Chat models → click the Muse Fast row → tick Enabled → Apply to the list → Save. Every model ships disabled. Keep at least one free model enabled, or users without a plan cannot chat.
  6. Images (optional)Set a key under Image providers & keys (OpenAI and Gemini fall back to the chat keys) and enable a model on Image models & styles. If you do not offer images, switch Features → Image generator off.
  7. Check StatusConsole → Status → Re-run checks. "At least one chat model is enabled and has a key" and "Anthropic key is valid" should pass.
AI providers and keys page with the Anthropic key set and the test result Connection failed, Anthropic refused the API key (401)
Key tester · an invalid example key, real answer from Anthropic
Chat models page with the Muse Fast row being edited: provider, model id, tier, credit cost, capabilities and the Enabled checkbox
Chat models · editing Muse Fast (local console, sample data)

Check: curl <API_BASE_URL>/v1/health now shows "ai":"ok", and curl <API_BASE_URL>/v1/config lists your model under models. The API caches the config for 60 seconds, and the app loads it when it starts.

05Step 5 · Connect and run the app

cd app
flutter pub get
dart pub global activate flutterfire_cli    # once
flutterfire configure                        # pick your project and Android, iOS (and web if you want)

Terminal: macOS or Linux as shown; on Windows use WSL or Git Bash (how).

flutterfire configure rewrites lib/firebase_options.dart and adds android/app/google-services.json and ios/Runner/GoogleService-Info.plist. Until you run it, the app shows "Connect your Firebase project". Change the app id first if you already know it (Release → ids), because the Firebase apps are registered under that id.

Start an Android emulator or connect a phone with USB debugging, then:

flutter run --dart-define=API_BASE_URL=https://us-central1-<your-project-id>.cloudfunctions.net/api

Terminal: macOS or Linux as shown; on Windows use WSL or Git Bash (how).

Without API_BASE_URL the app shows "Set your API address". With both in place, it opens the onboarding; after it, send a message. The answer comes from your provider, under the model's label.

Check: console → Overview shows today's chat message count going up, and Firebase console → Functions → Logs shows a line chat with status: "done" and token counts (never the text).

06Step 6 · Optional modules

Each of these needs its own provider key (your own account, your own usage bill) and ships switched off. Turn on only what you want to offer:

ModuleConsoleGuide
Discover (news feeds with AI briefs)Discover feeds page and settings, Features → DiscoverDiscover
Natural voices, transcription, auto captionsVoices & transcription page and settings, FeaturesVoice
AI videoVideo page and settings, Features → AI video generationVideo Studio
Image edit, remove background, upscaleImage tools page and settings, FeaturesImage tools
Plans, credit packs, Remove adsPlans, Paywall, Store & purchasesPlans and paywall, In-app purchases
AdsAds and the network id pagesAds

07Optional · Everything on your computer with the Firebase emulators

For development without a cloud project (needs Java 21+ and the Firebase CLI). Use three terminals:

cd firebase/functions && npm ci
npm run serve
# auth 9099, firestore 8080, storage 9199, functions 5001, project demo-museai
# API: http://127.0.0.1:5001/demo-museai/us-central1/api

Terminal: macOS or Linux as shown; on Windows use WSL or Git Bash (how).

cd admin
FIRESTORE_EMULATOR_HOST=127.0.0.1:8080 npm start

Terminal: macOS or Linux as shown; on Windows use WSL or Git Bash (how).

cd app
flutter run -d chrome --dart-define=USE_EMULATOR=true \
  --dart-define=API_BASE_URL=http://127.0.0.1:5001/demo-museai/us-central1/api

Terminal: macOS or Linux as shown; on Windows use WSL or Git Bash (how).

demo-museai is a Firebase "demo-" project id: the emulators run it without any cloud project. With USE_EMULATOR=true the app connects to the Auth and Firestore emulators even before flutterfire configure; on an Android emulator the host is 10.0.2.2 (set EMULATOR_HOST to override). The scheduled functions are listed but not triggered by the emulator.

08Optional · Run the tests

cd app && flutter analyze && flutter test
cd firebase/functions && npm test && npm run test:emu && npm run test:rules
cd admin && npm test && npm run test:emulator

Terminal: macOS or Linux as shown; on Windows use WSL or Git Bash (how).

Run each line from the source/ folder. The emulator and rules tests need Java 21+ and the Firebase CLI.