Introduction
Evolve × OpenJev started with a simple observation: a recruiter clicking through from a LinkedIn job post and a developer arriving from a GitHub repo want different things from the same portfolio, yet a static page shows them both the same brochure. Evolve makes the page adapt to whoever is reading it, and OpenJev is the free decision API that tells it who that is.
The problem with static pages and A/B tests
A/B testing picks one winner for everyone, so a page that works for recruiters loses for developers and the other way round. Personalisation fixes that only if you can tell visitors apart, and the obvious tool, a classifier, has a trap: when it is confidently wrong, it splits traffic into segments that each learn from the wrong people. In my simulator, routing on zero-shot Laya made conversion worse than not segmenting at all.
If you route by a model's prediction, its calibration matters more than its accuracy.
Architecture
Every slot on the page (hero title, intro line, project order) is a gene, and each audience keeps its own population of page genomes inside a Cloudflare Durable Object. Each genome holds a Beta posterior over a session reward built from real engagement such as project clicks, GitHub visits, résumé opens and contact, and Thompson sampling picks one per visit. Every 30 minutes, genomes that have had a fair hearing and are clearly losing retire, and the two best breed children by crossover and mutation. A 10% holdout keeps measuring lift against the original page.
On a first visit the edge renders what it can observe (referrer, campaign, landing page, language, device) into one sentence and asks OpenJev two typed questions, audience and intent, after the response is sent, so the visitor never waits. OpenJev is a Cloudflare Worker with hashed keys, per-key rate limits, a D1 decision cache and origin health checks. Behind it, a fine-tuned Laya was distilled into a 23 MB MiniLM student with calibrated heads that runs on a free 1 GB Oracle VM.
What I prioritized
The engineering decisions that made it work on ₹0:
- Visitors never wait. Classification runs after the response; the first view gets the global population and the segment is ready by the next one.
- Exact-posterior training data. A seeded generative model of visitors gives every training row the true Bayes posterior, so the model learns honest uncertainty.
- Distilled to a free VM. A 23 MB int8 student matches the fine-tuned teacher (0.823 vs 0.817) at about 100 ms and 93 MB of RAM.
- Edge-native and ₹0. Workers, Durable Objects and D1 hold every population and decision; an 11 ms cache keeps repeat visitors off the model.


