First-run setup form
When you visit https://<your-site>/admin/ for the first time after uploading dist/admin/, the admin detects there's no Firebase configuration baked in (because config.js ships as a null stub for the no-build path) and renders an in-admin setup wizard instead of the normal sign-in page.
This wizard does what a developer would otherwise do via .env: collect Firebase + Flexweg credentials, validate them, and persist them so the admin works.
Prerequisites
Before you start the wizard, you should have:
- Firebase config copied from the Firebase Console (Project settings → General → Your apps → SDK setup) — six values:
apiKey,authDomain,projectId,storageBucket,messagingSenderId,appId. See Firebase project setup. - Bootstrap admin email + password — the user you created in Firebase Authentication. The email MUST match the one pinned in your Firestore rules.
- Flexweg API key, site URL, API base URL — see Flexweg account setup.
If anything's missing, fix that before opening the wizard.
The wizard
The wizard has three steps:
Step 1 — Welcome
Introduces the CMS and emphasises that:
- The CMS itself is free — Flexweg never bills you for using it
- It needs a free Firebase project to store data
- It takes ~5 minutes to set up
Two buttons:
- Firebase setup tutorial — opens the Firebase guide in a new tab. Click this if you haven't created your Firebase project yet.
- I have created my Firebase project — proceeds to step 2.
Step 2 — Terms of use
A 7-section terms of use document explaining:
- Free service — the CMS is provided free of charge by Flexweg
- Provided as-is — no warranty, may have bugs
- Your content, your responsibility — you handle copyright, image rights, GDPR, third-party licensing
- Your Firebase account, your security — you secure your Firebase project (passwords, rules)
- Limitation of liability — Flexweg isn't liable for revenue loss / data loss
- Your data stays yours — content lives in your Firebase + your Flexweg, no third-party transmission
- Fair use — illegal / fraudulent use may result in hosting suspension
A checkbox at the bottom: I have read and accept the Terms of use. Until ticked, the Continue button is disabled.
Click Continue to configuration when ready.
Step 3 — Configuration
Three sections of fields:
Firebase:
- API key
- Auth domain (e.g.
your-project.firebaseapp.com) - Project ID
- Storage bucket (e.g.
your-project.appspot.com) - Messaging sender ID (numeric)
- App ID
Paste each value from your Firebase config object.
Bootstrap administrator:
- Email — the admin's login email (must match the user you created in Firebase Auth AND the email in your Firestore rules)
- Password — the admin's password
Flexweg API:
- API key — generated in your Flexweg dashboard
- Site URL — e.g.
https://mysite.flexweg.com(no trailing slash) - API base URL — pre-filled to
https://www.flexweg.com/api/v1, change only if Flexweg gave you a different endpoint
Click Save & continue.
What happens when you click Save
The wizard runs through six validation steps in order, showing a spinner overlay with the current step:
-
Signing in to Firebase — initialises Firebase with the form values, then
signInWithEmailAndPassword. Catches and reports auth errors clearly:auth/invalid-credential→ wrong email/passwordauth/user-not-found→ user doesn't exist in Firebase Authauth/api-key-not-valid→ wrong Firebase configauth/operation-not-allowed→ Email/Password provider not enabled in Firebase Consoleauth/too-many-requests→ temporary lockout, wait or reset password
-
Verifying admin email — checks
auth.currentUser.email === form.adminEmailto catch typos. If they don't match, you get a clear error. -
Testing Flexweg API — pings
/files/storage-limitswith the API key. If the key is wrong (HTTP 401/403), the form rejects before any Firestore write. -
Saving configuration — writes
config/flexwegto Firestore. If your Firestore rules don't grant write to this path, you get a specific error pointing to the rules section of the README with the admin email pinned in. Fix the rules and retry. -
Uploading config.js — writes a populated
config.jsto your Flexweg site (replacing the null stub). Subsequent admin loads will pick up the values from this file. -
Syncing theme assets — uploads each theme's CSS + companion JS files (
menu-loader.js,posts-loader.js) to/theme-assets/so published pages have something to reference. Non-fatal: if this fails, you can re-trigger via Themes → Sync theme assets later.
The overlay shows each step and the progress accumulates with green checkmarks. After step 6, the admin reloads automatically.
After the wizard
Once the wizard reloads:
- The admin loads
config.js(now filled), reads its values viawindow.__FLEXWEG_CONFIG__ - Initialises Firebase with the saved config
- Picks up your existing sign-in session (so you don't have to log in again)
- Lands you on the dashboard
The wizard never appears again on this deploy unless someone manually clears config.js on Flexweg.
What if something fails
The wizard surfaces specific error messages for each failure mode, and the form preserves your entered values across retries — you only need to fix the broken bit.
Common issues:
"Email/password sign-in is not enabled"
The Firebase project's Authentication has Email/Password disabled. Open Firebase Console → Authentication → Sign-in method → enable Email/Password.
"Firestore rejected the configuration write"
Your Firestore rules don't allow writing config/flexweg. The error message includes the email it expects to see in the rules. Open Firebase Console → Firestore → Rules and ensure:
- The bootstrap admin email matches what you typed in the form
- The rules allow
match /config/{docId}writes
See Firestore security rules for the recommended ruleset.
"Flexweg API key rejected"
The Flexweg API key is invalid or expired. Open your Flexweg dashboard → Account → API → regenerate or verify the key. Paste the new value back in the form and retry.
"Could not sign in to Firebase. [auth/...]"
Generic catch — the form appends the actual Firebase error code in brackets. Common codes:
auth/configuration-not-found— Firebase project's Authentication isn't fully configured. Re-check that Email/Password is enabled.auth/internal-error— transient Firebase issue, retry in a moment.
Admin renders with no plugins / themes after success
This happens when the dist was deployed without the per-plugin/per-theme bundles. The admin is configured but can't find externals to load. Check that /admin/plugins/<id>/bundle.js and /admin/themes/<id>/bundle.js exist on Flexweg. If they don't, your dist/admin/ upload was incomplete.
Path B equivalent (.env)
If you're a developer using local builds with .env:
# .env
VITE_FIREBASE_API_KEY=AIza…
VITE_FIREBASE_AUTH_DOMAIN=your-project.firebaseapp.com
VITE_FIREBASE_PROJECT_ID=your-project
VITE_FIREBASE_STORAGE_BUCKET=your-project.appspot.com
VITE_FIREBASE_MESSAGING_SENDER_ID=1234567890
VITE_FIREBASE_APP_ID=1:1234567890:web:abcdef
The Flexweg API key + site URL + base URL are NOT in .env — they're entered in Settings → General of the admin (Path B users still go through that screen). With .env filled, the in-admin wizard is bypassed entirely on first load.
Continue
- Deployment — upload
dist/admin/anddist/theme-assets/ - Local development — Path B for developers