jevzen
September 18, 2026 · View on GitHub
A small Chrome extension demo: describe what you want less of on X, then watch matching posts crossfade into zen scenes or cat photos as you scroll. Posts keep their original height, so the timeline stays in place. Reveal any post with one click.
Built with TypeSafe Jev and Effect. Bring your own API key. No hosted backend.
Watch the 14-second demo · Extension documentation · MIT license
Try it
You need Node.js 22.9+ and pnpm 9.5.0 to build. No API key is needed for the build.
git clone https://github.com/steventsao/typesafe-effect-playground.git
cd typesafe-effect-playground/feed-analysis
pnpm install --frozen-lockfile
pnpm build
- Open
chrome://extensionsand enable Developer mode. - Click Load unpacked and select
feed-analysis/distfrom this checkout. - Open jevzen, expand Connection & privacy, and save your provider key.
- Refresh X, write your rules, click Apply, and scroll.
For example:
Keep posts with demos and thoughtful criticism. Turn down ads, launch hype, and engagement bait.
Choose Zen scenes or Cat photos under Replace with. Show original, Undo last, Show all, and pausing filtering restore the original posts. There is no Chrome Web Store release; this demo is installed unpacked.
What it does
- Checks text posts when they enter the viewport, with at most two pending requests per tab.
- Sends your rules and post text to Jev, then uses the returned probability to decide whether to switch the post.
- Crossfades matching posts to a bundled photo without removing or collapsing timeline cells.
- Lets you group loaded posts by topic or story, or use optional fading instead of photo replacement.
- Supports direct TypeSafe, OpenRouter Decisions, and Cloudflare Jev with your own credentials.
This is an experiment in giving readers more control over their feed. It can misinterpret rules or miss posts. It does not analyze images, videos, or linked pages, and X can change its page structure. API calls use your provider credits; scrolling and grouping posts can incur charges. OpenRouter and Cloudflare adapters have offline contract tests but have not been verified with funded live accounts.
Privacy
Your rules and evaluated post text go to the selected provider. Provider retention policies apply. The extension does not send DMs, cookies, or author metadata, and never performs account actions such as muting, blocking, liking, or posting.
Keys stay in chrome.storage.local, restricted to trusted extension contexts.
They are not synced or shared with X. The extension caches hashed-text decisions
in session storage, not raw posts. Photos are bundled locally; loading one makes
no external image request. See the extension guide for
data flow, provider setup, and validation limits.
Development
The extension lives in feed-analysis/. Its optional synthetic feed lab builds
into dev-dist/ and is excluded from the installed extension.
# From the repository root: original ticket example, offline checks.
pnpm install --frozen-lockfile
pnpm typecheck
pnpm test
# Extension checks, also offline.
pnpm --dir feed-analysis install --frozen-lockfile
pnpm --dir feed-analysis typecheck
pnpm --dir feed-analysis test
pnpm --dir feed-analysis build
pnpm --dir feed-analysis exec playwright install chromium
pnpm --dir feed-analysis test:browser
GitHub Actions runs typechecking, unit tests, the build, and the browser suite on pushes and pull requests. Tests use synthetic posts and mocked provider responses; no CI secrets or paid API calls are required. Effect packages are pinned to a compatible v4 release candidate.
The original support-ticket demo remains at the repository root. It demonstrates typed decisions, validation, retries, and a Promise API over an Effect runtime.
Contributing
Small fixes and experiments are welcome. See CONTRIBUTING.md for local checks and the boundaries this demo keeps.
Credits and license
Inspired by the scan/judge/act approach in realZachi/typesafe-adblock. The four bundled photos were generated for this project; their prompts are in public/photos/PROMPTS.md.
Original code, documentation, and generated photo assets are available under the
MIT license. Dependencies retain their own licenses; extension builds
include THIRD-PARTY-NOTICES.txt. Third-party posts, branding, and interface content
visible in the demo recording remain the property of their respective owners and
are not relicensed by this project.
