A static, vanilla JavaScript restore of the jobs app using the recovered job data pool.
- Screenshot-style tile/card job rails by geography.
- Basic/Advanced-style header controls and filter-chip rows.
- Rich job tags from recovered columns: location, pay, employment type, seniority, industry, skills, certifications, and achievements.
- Hover overlay with Save, Mark Applied, Apply Directly, hide/report, share, View all, and See views affordances.
- Saved jobs and applied jobs state, kept private per user.
- Google sign-in/account syncing through Firebase Auth + Firestore, with a local browser fallback for development.
- Reddit-style company forums with persisted public posts, nested comments, upvotes/downvotes, and author profile pages.
- Public user profiles with display name, headline, bio, post/comment counts, vote counts, and karma-style stats.
- Static hosting anti-scraping headers for
/data/assets where supported.
Because the app includes data/jobs_restored.js, it can open directly as a file. For best behavior, serve it:
python3 -m http.server 8000Then open http://localhost:8000.
- Create or open a Firebase project.
- Add a Web app in Firebase Project Settings.
- Enable Authentication -> Sign-in method -> Google.
- Create a Firestore database in Firestore Database, not Realtime Database. Choose Native mode if prompted, start in production mode, and pick the region you want to keep.
- Paste your Firebase web config into
firebase-config.js. - Add the Firestore indexes and starter rules in
documentation/firestore-production.md.
You do not need to manually create tables. Firestore collections are created by the app when the first profile, saved job, post, comment, or vote is written. The app writes private job state under users/{uid}/private/jobState and public community data under forumPosts, forumComments, forumVotes, and users.
This static restore avoids rendering all apply links as raw anchors, blocks indexing of /data/, and adds noindex/noarchive headers for CSV/data assets on hosts that honor _headers or netlify.toml. A determined scraper can still extract client-side data because the browser must receive it. Real protection requires a backend/API layer with server-side search, sessions, rate limits, bot checks, and signed apply URLs.
The private request dashboard lives at /usage-dashboard/. Set USAGE_DASHBOARD_PIN in Netlify to enable the same PIN-lock cookie auth used by the other Job Pool apps. The crawler-tracker Edge Function records aggregate request counts into Netlify Blobs, and the dashboard reads them through /.netlify/functions/get-crawler-usage after auth. The dashboard is marked noindex,nofollow,noarchive.