Skip to content
MrJev

jev-feels

Ruby and Rails: email.feels?(:urgent) as a named question on a field, with decide and score beside it and validations that use them.

View on GitHub →

Checked, not fully reviewed

email.feels?(:urgent) as a named question on a field, with an Active Model validator. Checked, not fully reviewed: its suite, and what each call sends.

Good for

  • Rails models that want one named judgment on one field, without a service object
  • Validations: `validates_feeling :body, :urgent, threshold: 0.9`

Watch out for

  • Each predicate is its own request, and asking twice asks twice
  • The README's batch example does not run as written

Tested Oct 1, 2026 at 76fa9af29e39 · Ruby 3.4 in Docker; its 179 examples plus our own probes through its scripted transport

Checked, not fully reviewed. We ran its own suite and the documented quickstart, and measured what a call sends. We made no Jev calls and used no API key.

feels :body, :urgent turns a named question into email.feels?(:urgent); decide and score cover the other two answer types, and validates_feeling puts a threshold into Active Model validation. The declaration binds a question to a field, which is the part that reads well: the question lives next to the data it asks about rather than in a service object three files away.

179 examples pass on Ruby 3.4, with the one live-API example correctly pending without a key. The state it sends is the attribute’s text and nothing else.

The cost shape is worth knowing. We measured three predicates on one object called one at a time: three requests, one question each. Asking the same predicate twice on the same object asks twice — there is no per-instance memo, so a view that calls feels? in a loop pays each time.

Jev.measure exists for that, and batches several questions into one request — but the README’s batch example passes a record (Jev.measure(ticket)) where the method wants text, and raises ArgumentError: text must be a String. Passing the text works and gives one request for all the questions. We reported it; until it is fixed, reach for Jev.measure(record.body) { … } rather than several predicates in a row.

MIT, 19 stars, a week old. Pleasant to read, and the smaller cousin of Truffler, which stores answers and ranks in SQL instead.

See how it compares with other tools in Best Jev tools, tested hands-on.

Review updated Oct 1, 2026. Numbers quoted from the project are its author's own; we don't publish our own measurements of Jev.

More in Libraries & Integrations

agentrun

★ 423▲ 13

Parcha-ai/agentrun

A workflow DSL for agents with a Jev package for the steps that are decisions rather than generation.

TypeScript

switch

★ 420▲ 170

osolmaz/switch

TypeScript framework for decision-model harnesses: your program offers a short list of next steps and the model picks one at a time until it can answer, with chess, wikirace and rubric-judge examples run on Jev.

TypeScript

Ten Levels of Jev

★ 264▲ 10

disler/ten-levels-of-jev

Thirty worked uses arranged in ten levels, from one if statement to an agent that reaches for Jev itself, with a video walkthrough.

TypeScriptReviewed

Get new Jev projects every week

New Jev releases, pricing changes, and the best new projects, once a week. No spam; unsubscribe anytime.

Powered by Buttondown. See our privacy policy.