Ivan Habor
Search

Projects

Jevtown

A social network where people write and 10,000 AI personas read. Post a text, a listing or a headline and see how far it travels, who stops and why the rest scroll past.

Status
Shipped
Year
2026
Stack
Jev (TypeSafe) / Cloudflare Workers / D1 / Vanilla JS / MCP

Every reaction in Jevtown comes from Jev, the TypeSafe model I also used for Jev Wrapped. It writes no text. It answers typed questions with probabilities, fast and cheap enough to ask a whole town about one post.

A persona can scroll past a post, like it, repost it, block the author, write to the seller or buy. Most scroll past.

What a post gets

A post goes out in waves: 600 people, then 1,500, then 3,000, then everybody else. It starts with the 600 Jev thinks it is for. It goes on to the next wave only when glad reactions outnumber sorry ones by at least a tenth of the wave. Glad reactions include likes, reposts, messages to the seller and purchases. Sorry ones include blocks, annoyance and smelling a scam. In my measurements a niche post stopped at 5,100 people, a broad one reached everybody, a listing stopped at 2,100 and a weak text died at 600.

A check costs about a cent for a text that dies in the first wave and ten cents for one that reaches all 10,000. It takes between 3 seconds and a minute.

Each post has a map of 100 × 100 dots, one per persona, with similar people next to each other. A good post spreads across it. Spam, rage and scam listings die in the first wave.

When a check closes, the town is asked up to three questions, each of up to 100 people the post reached: why they scrolled past or got annoyed, what made them stop, and what they would write in the comments. The post page breaks the reactions down by interest, job, age, temper, budget, city and shopping, and names the people who reacted. An edited text goes to the same people and is shown next to the version before it.

A listing also gets the questions buyers would ask the seller first. A product gets a price ladder: how many would buy at each price, and which price earns the most.

The Jevtown home page. On the right, one iPhone listing from the saved example: 2,100 personas saw it, 142 wrote to the seller and 6 smelled a scam.

The home page opens with one iPhone listing written two ways, replayed from two saved checks, so a visitor sees what the town does before writing anything.

An audience in words

An author can say whom a post is for, for example “people who work in IT and are into startups”. Only the personas who fit every part of that read it, and the waves, the counts and the map are about them. The town knows work, age, interests, money and shopping. Words about anything else do not count, so “tech founders of early-stage B2B SaaS” becomes everybody who works in business.

Residents

A visitor can make up a person and move them into town. The resident lives next to the 10,000, reads every new post that reaches them and reacts like anybody else, with Jev answering for them. To tune one, you say what they do with twelve posts. Then comes a try round of eight new posts: you answer first, Jev answers without seeing that, and the page counts how often it guessed.

Every answer is kept, and the six closest to a new post go into the question Jev is asked. I tested this on three made-up readers who follow hidden rules, such as blocking anything written in capitals. With 24 of their answers kept, Jev picked the reader’s own reaction, out of seven, on 72% of new posts. With none kept it was 49%. Real people are less predictable than those three.

How the town works

The personas are not stored anywhere, and no language model wrote them. Each one is computed from its place on the 100 × 100 grid, which decides its age and main interest, so the same place always gives the same person. A persona is one line of English:

Oksana, 34, accountant, Lviv; into gardening, movies and TV series, travel; skeptical, distrusts ads and big claims; average income, careful with money

There are two towns of 10,000, Ukrainians and English speakers. A text is read by the one that speaks its language.

One request to Jev carries the text once and 100 personas, one question each. Each reaction is drawn from the probabilities Jev returned, seeded by the persona and the version of the text, so a reload shows the same reactions.

Moderation is seven yes-or-no questions to Jev, about hatred, explicit sex, threats, private data, illegal offers, insults and keyboard mashing. From 0.5 on any of them a post stays out of the public feed. From 0.85 it is not posted at all.

One Worker on the free plan

As with Jev Wrapped, the back end is one Cloudflare Worker with a D1 database, on the free plan. A free invocation may make 50 outgoing requests and use 10 ms of CPU, which is less than one check needs, so the browser drives the check. It sends the text, then asks for each batch of 100 personas and for the result of each wave.

The Worker alone decides who is asked. An author can narrow the town to an audience but cannot pick the people who read the post. There are no accounts. An author is a secret cookie, and the town keeps no memory of one: a persona that blocked an author after one post reads their next post like anybody else.

An MCP server

The repo also has an MCP server with two tools. compare_texts shows two to five variants to the first wave only and ranks them. check_text follows one text through the whole town the way a post page does. The server runs on your own machine with your own Jev key, and it stops at a daily budget, $1 by default.

What the numbers are not

A persona is a line of text, and Jev answers for it. A check shows how Jev expects these 10,000 descriptions to react, which is not the same as what real readers will do.

Stage

Live at jevtown.ivanhabor.com since 20 September 2026, in Ukrainian and English, with no sign-in. The code is on GitHub under the MIT license, and a 30-second video shows a listing rewritten twice.