Same tracker, backed by Firebase: Firestore for storage, Anonymous Auth so your data is private to your device/browser, Firebase Hosting to put it on a real URL. No custom backend server needed — the browser talks to Firestore directly.
Bonus over the plain Node version: Firestore pushes live updates, so if you have the app open on two devices signed in the same way, changes appear on both without a manual refresh — once you’re signed in the same way on both, see the note on syncing across devices below.
firebaseConfig object — copy it, you’ll need it in step 3 below.In the Firebase Console for your project:
cd public
cp firebase-config.example.js firebase-config.js
Open public/firebase-config.js and paste in the firebaseConfig values from
step 1.4. This file is gitignored — your keys won’t get committed. (Note: these
are not secret keys in the traditional sense — they’re safe to expose in a
client app — but keeping them out of git keeps your repo generic and reusable.)
npm install -g firebase-tools
firebase login
From the project root (where firebase.json lives):
firebase use --add
# Pick your project from the list, give it an alias like "default"
firebase deploy
This deploys both your Firestore security rules and the public/ folder to
Firebase Hosting. The CLI prints a URL like https://your-project.web.app —
that’s your live app, reachable from any device.
firebase emulators:start --only hosting
Opens the app at http://localhost:5000, still talking to your real
Firestore (not an emulated one) unless you also add the Firestore emulator —
fine for just checking the UI works before deploying.
Because sign-in is anonymous, “your data” is tied to a random anonymous user ID that Firebase creates per browser, not per person. That means:
request.auth.uid.Everything for one user lives in a single Firestore document:
users/{uid}/tracker/data
└── projects: [
{ id, name, color: { bg, ring }, createdAt,
tasks: [ { id, text, status, createdAt }, ... ] },
...
]
Simple on purpose — one document, one read, one write, matches how the original Claude artifact stored things. If your task lists get very large (hundreds of tasks per project) this would be worth splitting into subcollections, but for personal use it’s not necessary.
firestore.rules restricts every read/write to documents under the signed-in
user’s own uid — nobody else can read or write your data, including other
anonymous users.
project-tracker-firebase/
├── firebase.json
├── firestore.rules
├── firestore.indexes.json
└── public/
├── index.html
├── style.css
├── app.js # talks to Firestore directly
├── firebase-config.example.js # template — copy to firebase-config.js
└── firebase-config.js # your keys (gitignored, you create this)