# salari.dev Job Reality Check

A production-oriented, local-first website and Chrome extension for evaluating whether a developer job posting deserves a candidate's application time.

The product does **not** call a job “real,” “fake” or “a joke” based on text alone. It separates four text-supported dimensions from external hiring credibility:

- compensation honesty;
- role coherence;
- scope sanity;
- employer transparency;
- hiring credibility, shown separately as insufficient or limited evidence.

## What is included

### Website

- Candidate-facing landing page
- Fully working job-description analyzer
- Evidence-linked findings and annotated source text
- Application ROI score and verdict
- Salary-range parsing without fabricated market data
- Recruiter questions and missing-information checklist
- Local draft saving
- Local saved-role tracker with application status
- Private synchronization of saved roles to jobs.salari.dev
- Three-role comparison
- Methodology, privacy and terms pages
- PWA manifest and service worker
- Responsive design and print-ready reports
- Docker and Nginx production configuration

### Chrome extension

- Manifest V3 side-panel interface
- Current-page extraction after user invocation
- JobPosting JSON-LD extraction
- Selectors for common ATS and job-page layouts
- Selected-text and manual-paste modes
- Same local analyzer used by the website
- Local report saving in Chrome storage
- Markdown report downloads
- Context-menu actions
- No persistent host permissions
- No remote scripts, tracking or remote model calls

## Project structure

```text
salari-job-reality-check/
├── website/
│   ├── index.html
│   ├── check.html
│   ├── saved.html
│   ├── compare.html
│   ├── extension.html
│   ├── methodology.html
│   ├── privacy.html
│   ├── terms.html
│   ├── assets/
│   │   ├── css/styles.css
│   │   ├── js/
│   │   ├── icons/
│   │   └── images/
│   ├── downloads/
│   ├── manifest.webmanifest
│   └── sw.js
├── extension/
│   ├── manifest.json
│   ├── service-worker.js
│   ├── sidepanel.html
│   ├── sidepanel.css
│   ├── sidepanel.js
│   ├── analyzer-engine.js
│   ├── privacy.html
│   └── icons/
├── docs/
├── tests/
├── scripts/
├── Dockerfile
├── docker-compose.yml
├── nginx.conf
└── package.json
```

## Run locally

### Fast static server

```bash
npm run serve
```

Open `http://localhost:8080`.

Do not open the HTML files directly with `file://` when testing the PWA. A local web server is required for service workers and realistic URL behavior.

### Docker

```bash
docker compose up --build
```

Open `http://localhost:8080`.

## Test and validate

No npm packages are required.

```bash
npm test
npm run validate
npm run check
```

Build both ZIP artifacts with:

```bash
npm run package:artifacts
```

The checks cover analyzer behavior, JavaScript parsing, required files, local website links, Manifest V3 structure, icons and extension remote-code constraints.

## Install the Chrome extension locally

1. Open `chrome://extensions`.
2. Enable Developer mode.
3. Select **Load unpacked**.
4. Choose the `extension/` directory.
5. Pin salari.dev.
6. Open a normal job page and click the extension icon, or press `Alt+Shift+J`.

The extension requires Chrome 116 or newer because it uses the Side Panel API.

## Production configuration

Edit `website/assets/js/config.js`:

```js
window.SALARI_CONFIG = Object.freeze({
  siteName: 'Job Reality Check',
  siteUrl: 'https://jobs.salari.dev',
  extensionStoreUrl: '',
  marketApiUrl: '',
  privacyEmail: 'privacy@salari.dev'
});
```

`extensionStoreUrl` remains blank until the extension has a Chrome Web Store listing. `marketApiUrl` remains blank by design. The current product parses a posted salary but does not invent live market benchmarks.

## Connecting real salary intelligence

Keep the local text score independent from the market benchmark. A market response should identify:

- role family and level;
- location and remote jurisdiction;
- employment type;
- currency and normalization date;
- percentile range;
- sample size;
- source period;
- confidence.

A recommended response shape is documented in `docs/ARCHITECTURE.md`.

## Before public launch

The source is ready for local use and deployment, but a public commercial release still requires real operating details:

- production legal entity and governing terms;
- production contact addresses;
- final DNS and HTTPS;
- Chrome Web Store developer account;
- store screenshots and listing submission;
- verified privacy-policy URL;
- real salary-data source if market comparison is advertised;
- abuse, feedback and support process.

See `docs/RELEASE_CHECKLIST.md`.

## Important product limitation

Job-description text can reveal contradictions, omissions and risk. It cannot prove approved headcount, current hiring intent, company legitimacy or whether an employer will respond. The interface and report preserve that distinction throughout.
