Project Arjuna is a personal productivity dashboard built for UPSC preparation (2026–2028). It tracks your daily routine, study progress, finances, health, mind, growth, and tasks — all in one place.
Sign in with Google. Your data syncs automatically across all browsers and devices via Firebase Firestore. All changes on any device appear on every other device within seconds.
No sign-in required. Data is stored only in your browser's IndexedDB + localStorage. You'll see a 📴 Local badge in the header. Data is not synced across devices. Use the Backup feature to manually transfer data.
abhay-bhat.github.io. Also add localhost for local testing.asia-south1 for India).rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Master state document — all devices read/write here
match /users/{userId}/data/state {
allow read, write: if request.auth != null
&& request.auth.uid == userId;
}
// Device presence documents — one per device, records last-seen time
match /users/{userId}/devices/{deviceId} {
allow read, write: if request.auth != null
&& request.auth.uid == userId;
}
// Per-device state backups — isolated copy, never overwritten by other devices
match /users/{userId}/deviceStates/{deviceId} {
allow read, write: if request.auth != null
&& request.auth.uid == userId;
}
}
}
</> icon to add one (no need to set up Firebase Hosting). Copy the firebaseConfig object shown.Create (or edit) js/firebase-config.js in your repository with this content:
// js/firebase-config.js
// Replace ALL values below with your actual Firebase project values.
const FIREBASE_CONFIG = {
apiKey: "YOUR_API_KEY",
authDomain: "YOUR_PROJECT_ID.firebaseapp.com",
projectId: "YOUR_PROJECT_ID",
storageBucket: "YOUR_PROJECT_ID.appspot.com",
messagingSenderId: "YOUR_SENDER_ID",
appId: "YOUR_APP_ID"
};
.gitignore or use GitHub Actions secrets to inject it at deploy time.After saving and deploying, refresh the app. The sign-in overlay will appear and sync will be fully enabled.
Daily routine checklist, calendar, UPSC current affairs log, and quick check-ins for health and mind.
Subject-wise syllabus progress tracker, study schedule, and phase milestone overview.
Dubai savings tracker, investment portfolio with maturity projections, monthly expense log, and financial checklist.
Sleep, gym, and screen-time log with charts. Cholesterol tracker and health history.
NoFap streak tracker, meditation log, loneliness rating, and partner connection log.
Career milestones, book reading tracker, weekly & monthly review journal.
Kanban-style task planner with buckets (categories), priorities, due dates, and completion tracking.
Open the header menu (☰) → click Sync Now. The button shows ⟳ while syncing and ✓ when done. The status row below it shows the last sync time.
modifiedAt timestamp wins.done: true is sticky — a completed task stays completed regardless of which version wins.Open browser DevTools (F12) → Console tab and run:
ATHENA.syncDiag()
The table shows: enabled (must be true), isAuthenticated, pendingPush, listenerActive, etc.
If data is missing on a device, run:
ATHENA.forcePull()
This bypasses all guards and directly applies the latest Firestore state.
The app creates backups automatically at three points:
Backups are stored in IndexedDB inside your browser. They are local — not synced to Firestore.
// Create a backup right now
ATHENA.backup()
// List all backups (shows in console as a table)
ATHENA.listBackups()
// Restore a specific backup by key
ATHENA.restoreBackup('backup_key_here')
Open DevTools Console and run:
JSON.stringify(AppState._buildPayload())
Copy the output and save it as a .json file. This is your full data export.
| Symptom | Likely cause & fix |
|---|---|
| 📴 Local badge in header | Firebase is not configured. Check that js/firebase-config.js exists and has real values (not YOUR_API_KEY). See Section 2. |
| Sign-in overlay always appears | Your domain is not in Firebase Authorised Domains. Go to Firebase Console → Authentication → Settings → Authorised domains and add your site URL. |
| Sync enabled in console but data not appearing on Device B | Run ATHENA.forcePull() on Device B. If that fails, check Firestore rules in the Firebase console match Section 2 exactly. |
enabled: false in ATHENA.syncDiag() |
Firestore SDK failed to initialize. Check the browser console for the actual error. Common cause: incorrect API key or Firestore not created in Firebase project. |
| Data missing after restore | Select an earlier backup from the Backups modal. Backups are kept for multiple checkpoints — go further back in time. |
| Sync icon shows error (!) in menu | Network issue or Firestore rules too restrictive. Check your internet connection, then verify rules in Firebase Console match Section 2. |
| Quote strip shows same quote every day | The daily quote is cached in localStorage. To refresh: open DevTools Console and run localStorage.removeItem('athena_quote'); location.reload(); |
| App shows blank / white screen | JavaScript error during boot. Open DevTools Console, look for the red error, and check if all script files are loading (Network tab). Try a hard reload: Ctrl+Shift+R. |
| Tasks / data reset to empty | Accidental clearState() or restore. Immediately run ATHENA.listBackups() and restore the most recent pre-sync backup. |
Every time the security rules in Section 2 change, you must re-publish them in Firebase Console → Firestore → Rules. The app cannot do this automatically.
When you deploy to a new URL (e.g. custom domain, new GitHub Pages URL), you must add it in Firebase Console → Authentication → Settings → Authorised domains.
If you don't want to commit your real config, use GitHub Actions secrets:
FIREBASE_API_KEY, FIREBASE_PROJECT_ID, etc.- name: Write Firebase config
run: |
cat > js/firebase-config.js <<EOF
const FIREBASE_CONFIG = {
apiKey: "${{ secrets.FIREBASE_API_KEY }}",
authDomain: "${{ secrets.FIREBASE_PROJECT_ID }}.firebaseapp.com",
projectId: "${{ secrets.FIREBASE_PROJECT_ID }}",
storageBucket: "${{ secrets.FIREBASE_PROJECT_ID }}.appspot.com",
messagingSenderId: "${{ secrets.FIREBASE_SENDER_ID }}",
appId: "${{ secrets.FIREBASE_APP_ID }}"
};
EOF
If the app is stuck in a bad state, open DevTools Console and run:
ATHENA.clearState() // wipes localStorage and reloads (data still in Firestore)
ATHENA.forcePull() // pulls latest Firestore state, applies, and re-renders
ATHENA.syncDiag() // prints a table of all sync state variables to console
Project Arjuna • Master Your Path • 2026–2028