Jev Wrapped
ShippedPaste a public Telegram channel and get a card that shows what it posts and how much of it is ads, clickbait and emotional pressure, month by month for a year.
- Year
- 2026
- Stack
- Jev (TypeSafe), Cloudflare Workers, D1, Vanilla JS, SVG
- Link
- wrapped.ivanhabor.com
Jev is a model from TypeSafe that writes no text. You send it some state and typed questions, and it returns probabilities: one option out of ten, yes or no, a score. An answer takes about 300 ms, and judging one Telegram post costs about $0.00005 at list price.
I wanted to see what that speed and price allow that a chat model does not. Reading a whole year of a Telegram channel, post by post, is one answer.
What you get
Type a channel name at wrapped.ivanhabor.com. The page reads up to 1,500 posts from the last twelve months and asks Jev four questions about each one: which of ten kinds of post it is, whether it is a paid ad, whether it uses clickbait, and whether it pushes on fear or anger. While that runs, every answer shows up on the page as it arrives, next to the speed, the latency and the cost so far.
The result is a card. It names the biggest kind of post, shows the full mix, gives three percentages for ads, clickbait and emotional pressure, and draws the mix for each of the twelve months. The card downloads as a PNG and has a permanent address with a preview image for messengers.

Pavel Durov’s channel has 92 posts in the year. Judging them took 6 seconds and $0.0043. Українська правда, a news outlet with about 12,000 posts a year, was sampled down to 1,499 posts, which took 70 seconds and $0.08. It came out as 94% news with 3% clickbait.
Below the card the page lists the posts that scored highest on clickbait, pressure and advertising, so a reader can check the model’s extremes.
How it reads a channel
There is no Telegram login, bot or API key. A public channel has a web preview at
t.me/s/<channel> with about 20 posts per page. Post ids are consecutive integers, so the
id from a year ago is found by bisection in about a dozen requests. A channel with more than
1,500 posts is sampled: the pages are spread evenly across the year’s id range, so every
month is represented and the cost stays flat.
One Worker on the free plan
The back end is one Cloudflare Worker with a D1 database, and it fits the free plan. A free invocation may make 50 outgoing requests and use 10 ms of CPU, so no single request can read a channel. The browser drives the run instead. It asks the Worker for a plan, then for one page of 20 posts at a time, then for the totals. Every visitor’s run is paced by their own browser, so there is no job queue to fill up.
The browser sets the pace and nothing else. The Worker accepts pages only from a plan it made itself, takes post texts from t.me and never from the browser, and computes the card from rows it wrote. Nobody can put invented numbers on a channel’s card.
The link preview image is drawn by the Worker pixel by pixel into a palette PNG with a 5×7 bitmap font. There is no image library, and the file is about 6 KB.
What the numbers are not
Jev gives no explanation with an answer, and it makes mistakes. On Durov’s channel an early version counted his own auctions and partner launches as paid ads. A post now counts as an ad from a 70% probability on the yes/no question, or from 40% when the kind question also says “ad”. Treat a card as a reason to read a channel more closely.
Stage
Live at wrapped.ivanhabor.com, in Ukrainian and English. I built and deployed it in one day, 19 September 2026.