What is this?
Highlight any cringe LinkedIn post. A floating ๐ Translate button appears next to your selection. Click it. A loading window opens with a chicken that follows your cursor and pecks at it (yes, really). 1–3 seconds later the post's actual meaning is on screen — clichรฉs underlined on the left, a Real Life Translation card on the right.
The real product is a Tampermonkey userscript that runs on linkedin.com. The widget below is a live demo so you can play with it without installing anything.
What's on the card
- Category badge — one of: Humblebrag, ThoughtLeadership, FounderGrindset, NetworkingThirst, LayoffCoded, Promotion, ConferenceEnergy, CorporatePropaganda, VagueDrama, LifeLessonPost, RecruitingBait.
- 1–10 spice meter — how brutal the translation is.
- ๐ Speak button — reads the translation aloud with spice-driven voice modulation. Spice 1 = sympathetic narrator. Spice 10 = demonic, rushed, deep-voiced. No audio assets, no API; uses the browser's built-in Web Speech API.
- Clichรฉ phrase highlights — corporate clichรฉs in the original post are underlined; hover to see the plain-English subtext.
- Two alternate readings + tags + caption — for when one translation isn't enough.
Live Demo — feed the chicken ๐
Requires the backend running locally on http://localhost:8000 — docker compose up from the project root.
Development Team
Install the userscript
- Make sure the backend is running on
http://localhost:8000(this page wouldn't load otherwise). - Install the Tampermonkey browser extension.
- Open
userscript/linkedin-translator.user.jsfrom the project repo — Tampermonkey will detect the metadata header and offer to install. - Visit linkedin.com, highlight any post, click the floating Translate button.
Changelog
- 2026-05-02 Added a Development Team section with the team photo and LinkedIn (+ GitHub) links for all four hackers. Nav header now includes a Team link.
-
2026-05-02
Added a nav header with a dedicated ๐ Chicken page at
/chicken/— same cursor-following chicken as the loading screen, plus a live "pecks counted" tally. Chicken logic extracted intochicken.js; CSS factored intostyle.css. Both pages share one source of chicken truth. -
2026-05-02
๐ Chicken theme. Loading screen now has a chicken emoji that follows your cursor and pecks at it when it gets close, with random "cluck!" / "*peck*" / "bawk!" bursts. Egg-shell yellow background with floating eggs. The Translate button (userscript v0.1.5 + live demo) now reads
๐ Translate/๐ Cluckingโฆ. Userscript description updated: "Powered by chickens." - 2026-05-02 Added a ๐ Speak button on the translation card. Uses the browser's Web Speech API (no audio assets, no API). Voice pitch and rate are spice-driven: spice 1 reads in a soft sympathetic voice (pitch 1.4, rate 0.85); spice 10 reads deep and rushed (pitch 0.4, rate 1.3). Click again while speaking to stop. Renders in both the popup window and the live demo.
-
2026-05-02
Userscript v0.1.4: replaced page-context
fetch()with Tampermonkey'sGM_xmlhttpRequest. linkedin.com'sconnect-srcCSP blocks any page-script connection to localhost;GM_xmlhttpRequestruns in the extension's privileged process and bypasses page CSP. Added@connect localhostand@grant GM_xmlhttpRequestto the userscript header. -
2026-05-02
Backend: added
PrivateNetworkAccessMiddlewaresettingAccess-Control-Allow-Private-Network: trueon preflight responses. Mostly defensive — the userscript path usesGM_xmlhttpRequestwhich doesn't trigger PNA, but the GitHub-Pages live demo path needs it. -
2026-05-02
Userscript v0.1.3: real fix for the white-popup bug. The v0.1.2 blob: URL approach still inherited linkedin.com's
style-src/script-srcCSP, blocking the localhost stylesheet and renderer. Now the popup is opened athttp://localhost:8000/loading.htmldirectly, then navigated tohttp://localhost:8000/popup.html#<data>— the popup's origin is localhost, which has no CSP. Translation data is passed via the URL hash so it stays client-side. -
2026-05-02
Userscript v0.1.2: fixed the white-popup bug. linkedin.com's CSP enforces Trusted Types, which silently blocked
document.write. The popup now navigates toblob:URLs containing the HTML — blob documents have no CSP header, so external scripts (style.css, render.js) and inline JS run normally. - 2026-05-02 Userscript v0.1.1: comprehensive debug logging, an immediate "Translating…" placeholder in the popup, visible status line for asset-load failures (style.css / render.js), inline fallback styling so the popup is never pure white, and a collapsed Debug-data panel showing raw API responses.
- 2026-05-02 README expanded with a 7-step installation guide, a separate live-demo usage section, a no-Docker fallback, and a troubleshooting table.
-
2026-05-02
Live demo now calls
http://localhost:8000directly (absolute URL), and the backend's CORS allowlist includeshttps://t-kandasami.github.io— so the demo widget works on the deployed page as long as the visitor has the backend running locally. -
2026-05-02
Moved static site from
backend/static/to/docs/so GitHub Pages can serve it. Local backend reads the same files via theSTATIC_DIRenv var — one source of truth across local + deployed. -
2026-05-02
Initial build — FastAPI backend with
/translateand/highlights, Tampermonkey userscript with floating selection button + popup window, live demo widget on this page, shared meme-card renderer.
Update this list whenever code changes ship.