Thanks for your interest in fighting parasitic lead magnets on LinkedIn! Here's how to contribute.
git clone https://github.com/bastiensoret/Cesar.git
cd Cesar
npm install
npm run build- Open Chrome →
chrome://extensions/ - Enable Developer mode
- Click Load unpacked → select the
dist/folder - Go to linkedin.com and scroll your feed
Open an issue with:
- Screenshot of the badge (or lack thereof)
- Screenshot of the console logs (F12, filter on
[César]) - Your verdict: was César right or wrong?
- The post URL if possible
The detection patterns live in src/content/ in the THIRD_PARTY_PATTERNS and GATING_CTA_PATTERNS arrays. To add a new pattern:
- Identify a recurring CTA or third-party attribution phrase
- Write a regex that matches it (test on regex101.com first)
- Add it to the appropriate array with an English
labeland appropriateweight - Test with
__cesar.test("your test text")in the console - Submit a PR with before/after screenshots
LinkedIn changes their DOM structure frequently. If César stops detecting posts:
- Open DevTools on LinkedIn
- Inspect the post structure and find the new selectors
- Update the selectors in
src/content/(search forquerySelector) - Test that scanning works again
- Submit a PR
The system prompt lives in src/background/ in the SYSTEM_PROMPT constant. If you find a false positive or false negative with AI enabled:
- Share the post text and the LLM's response
- Suggest a prompt modification that would fix it
- Test with at least 5 other posts to make sure it doesn't break existing cases
Currently César detects FR and EN patterns. To add a new language:
- Add patterns to
THIRD_PARTY_PATTERNS(how people reference third-party content in that language) - Add patterns to
GATING_CTA_PATTERNS(how people gate content in that language) - Test on real LinkedIn posts in that language
- Update the README with the new supported language
| Directory | Purpose |
|---|---|
src/content/ |
Content script — detection engine + overlay injection |
src/background/ |
Service worker — LLM API routing + prompt caching |
src/popup/ |
Extension popup UI (HTML + CSS + JS) |
src/debug/ |
MAIN world bridge for console debugging |
src/shared/ |
Shared utilities (storage, sanitization) |
static/ |
Icons and CSS copied to dist/ as-is |
tests/ |
Vitest unit tests with jsdom |
- All static UI text in English
- LLM-generated content adapts to post language
- Pattern labels in English
- Console logs prefixed with
[César] - No external runtime dependencies — fetch-only for LLM calls
- Run
npm run lintandnpm run testbefore committing
- Fork the repo and create a feature branch (
git checkout -b feature/my-feature) - Make your changes
- Test on your LinkedIn feed with debug mode on
- Commit with a clear message describing what changed
- Open a PR with:
- What you changed and why
- Screenshots if UI-related
- Test results (posts tested, verdicts)
See CODE_OF_CONDUCT.md. Be respectful, constructive, and focused on making LinkedIn a better place.