Shaduf.Research preview
Use casesFive projects read at pinned commits · price rechecked 05:16 UTC

Jev email classifier (TypeSafe AI): what each Gmail and lead sorter does to your inbox when Jev fails or is unsure

"jev email classifier" was Google's first suggestion for the words "jev email" when the pool checked on . A suggestion shows that people search for something; it does not show how many. Bing, DuckDuckGo and YouTube offered no Jev email suggestion. This page reads the source code of five public projects that sort email or sales leads with Jev. It compares what access each asks for to your mailbox, what it does without asking you, what it sends to Jev, and where an email ends up when Jev fails or is unsure. It then works out the cost per 1,000 emails and ends with seven design rules.

Key finding

Of 5 email and lead sorters read in source, none touches the mailbox when Jev errors; of the 3 that can write to Gmail or IMAP, only 1 routes unsure mail to a Review label.

Documentedsource at pinned commits, checked

Projects picked by stars from a GitHub search for 'jev email OR jev gmail OR jev inbox' (59 results, 3 Oct 2026), plus one lead-qualification project found that day. Not a survey; stars are not adoption (how the five were chosen). All five are code-backed integrations. The pool installed none of them, connected no mailbox and made no Jev call. None of the five has been independently confirmed as working in real use.

What the five projects add up to

Five sorters, one square each: a filled square counts towards the number on the left

  • J Jevmail
  • I ilyamk Gmail labeler
  • P parth-kp IMAP classifier
  • V vynnlee jev-mail
  • S spam-leadgen-pipeline
  • Can change the mailboxlabel, move, archive, flag, read state3/5
    • J no
    • I yes
    • P yes
    • V yes
    • S no
  • Has delete or trash codeeven with full-mailbox access (V, P)0/5
    • J no
    • I no
    • P no
    • V no
    • S no
  • Changes the mailbox when Jev errorsHTTP error, rate limit or timeout0/5
    • J no
    • I no
    • P no
    • V no
    • S no
  • Sends unsure mail to a "Review" labelcounted among the 3 that can write1/3
    • J does not write
    • I no
    • P no
    • V yes
    • S does not write
  • Cuts the email body before sending1,000 to 5,000 characters4/5
    • J yes
    • I yes
    • P no
    • V yes
    • S yes
  • Counts
  • Does not count
  • Not counted: this project does not write to the mailbox
Counts from the project table below. They describe these five projects only, which were picked by GitHub stars as a reading order, not as a sample. Documented source at pinned commits, 3 Oct 2026.

Who can touch your mailbox, and who asks first

Two of the five only ask for read-only Gmail access. The three that can write do not ask you about each message. Documented source, 3 Oct 2026

  • Read-only: JevmailAsks only for gmail.readonly. The code says: "Never add gmail.modify, gmail.labels, or mail.google.com here". It sorts emails into lanes inside its own app database, so Gmail itself never changes.
  • Read-only: spam-leadgen-pipelineAsks for gmail.readonly and reads the spam folder. Without asking you, it writes classifications and a qualified flag for each sender to a Supabase database. According to the README, outreach is drafted elsewhere Reported.
  • Writes, preview by default: ilyamkAdds labels, and archives only in one mode for a spam rule at confidence ≥ 0.93. Preview is the default, and jobs run only when you start them from its interface. Its Gmail scope is not declared in the repository.
  • Writes, live by default: parth-kpLogs in over IMAP with an app password, which gives it full mailbox access. It can tag, move, flag, mark read or unread, and call a webhook. If you run jev-mail with no arguments, it acts on the mailbox straight away. Dry-run is opt-in.
  • Writes on a timer: vynnleeAsks for the full https://mail.google.com/ scope, which would also allow permanent deletion. It labels, stars and, in archive mode only, archives. Once switched on, it runs on a timer and does not ask about each message.

Five projects: where an email goes when Jev fails or is unsure

Open a situation to highlight its column and read what the five do. Opening one closes the others. Every cell comes from source at the commit shown. Failure terms use the pool's shared vocabulary: fail-closed (stop, refuse or take the cautious outcome), fail-open (act anyway), advisory (flag only), fallback (a stated substitute outcome), no-decision (no result, no action). Documented Read 3 Oct 2026, 05:19–05:25 UTC

The Jev call failsHTTP error, rate limit or timeout

None of the five changes the mailbox. Three stop or pause the run: ilyamk, parth-kp and spam-leadgen. vynnlee retries the thread later with backoff. Jevmail leaves the email unclassified and retries it on the next run. Repeated 429 responses pause that run, and a 403 stops it. Jevmail, ilyamk and vynnlee set no HTTP timeout in code.

Jev is unsureLow confidence or below the threshold

Of the 3 that write: vynnlee puts the email under a "Review" label and leaves it in the inbox. ilyamk makes a second, full-body call and then applies that answer's label without checking confidence again; archiving is still gated at 0.93. parth-kp does nothing, but marks the email as processed, so it is never checked again. Jevmail only flags the email; spam-leadgen marks the sender as not qualified.

Malformed answerUnknown category, missing fields, bad probabilities

2 of 5 check the answer strictly before acting: ilyamk and vynnlee. Jevmail turns an unknown category into "promotional". parth-kp raises an error on a missing answer but does not check that probabilities lie between 0 and 1, so a value of 1 or more would trigger actions.

No API keyand ways around the Jev call

Four refuse to run without a key. For spam-leadgen this was not determined: it creates the official SDK client with no arguments, and how the SDK behaves without a key was not read. Jevmail's /preview is a simulator that makes no Jev call.

Project (commit)Mailbox access and automatic actionsJev error or timeoutUnsure answerMalformed answerNo key
Jevmail (f6f20af)Next.js web app. Choice over 5 lanes, urgency Score, "is personal" boolean. Through Vercel AI GatewayRead-only gmail.readonly. No mailbox actions; lanes are app recordsno-decisionEmail stays unclassified and is retried next run. Repeated 429s pause the run; 403 stops it. 5xx retried onceacts-anyway (flagged)Top-two gap < 0.15 sets a lowConfidence flag; the lane is still assignedfallback-promotionalCategory outside the 5 lanes becomes "promotional"fail-closedSorting never starts without AI_GATEWAY_API_KEY
ilyamk Gmail labeler (ade42bf)Google Apps Script web app. One Choice over up to 12 label rules. Through OpenRouterLabels, archive Scope not declared (unknown). Preview by default; jobs started from the UI, no timerfail-closedOne retry wave, then the job pauses; 401/402/403 throw. No Gmail changefallback-full-body call, then acts-anywayConfidence < 0.75 triggers a full-body call; its label is applied without a confidence check. Archive still needs ≥ 0.93no-decisionStrict check; one retry, then skipped as "Not assigned"; 3 in a row pause the jobfail-closed"Enter an OpenRouter API key or save one first."
parth-kp IMAP classifier (db96194)Python IMAP command-line tool. One Noul per category. TypeSafe direct first, then OpenRouter or VercelFull IMAP Tag, move, flag, read state, webhook. Runs live with no arguments; no action logfail-closedThe run stops; the current email is not marked processed. 15 s timeout, no retriesno-decisionBelow 0.6 no action, but marked processed and never checked againfail-closed, with a gapMissing answer raises; probabilities are not range-checkedfail-closedExits with "no Jev API key found"
vynnlee jev-mail (61e346f)Command-line tool that deploys an Apps Script worker. Two Nouls plus a bucket Choice. TypeSafe directFull Gmail scope https://mail.google.com/. Label, star, archive (archive mode only). Runs on a timer once enabledfail-closedRetry recorded with backoff from 1 min up to 6 h; Gmail untouchedheld: Review labelUnsure action, bucket confidence < 0.6, or unknown choice: "Review" label, kept in the inboxfail-closedInvalid JSON, missing or out-of-range values throw; same retry pathfail-closed"TypeSafe API key is not configured"
spam-leadgen-pipeline (78a7592)Node script, lead mining from the spam folder. Two Choices (one with "None of the above") plus a Noul. Official SDK, default modelRead-only gmail.readonly, spam folder. Writes lead records to Supabase without confirmationfail-closedNo try/catch: a rejected batch ends the script; earlier batches stay written. Timeout: SDK default (not read)fallback-not qualifiedQualified only if business type ≥ 0.6 and legit ≥ 0.5; otherwise stored as not qualifiedfail-closedMissing answer throws; a missing legit is written first, then throwsnot recorded: not determinedDepends on the SDK (not read)
  • fail-closed or held (a person or the host's own prompt decides)
  • fail-open or acts-anyway; a "conditional" cell that can act is counted fail-open
  • fallback-<what> (named in the cell)
  • no-decision: nothing returned; the caller must handle it
  • not recorded, not applicable or no-threshold (the cell says which)

Colours follow the shared legend on when Jev fails (changed ; this page used its own colours before).

Unsure-answer cells use the pool's below-threshold terms of 4 Oct: acts-anyway (the action runs as if Jev were confident), held, fallback, no-decision, advisory or no-threshold. Cross-domain counts are on when Jev fails: compare with other use cases.

Undo: the labels, moves, flags, stars and archiving done by the three writers can be reversed by hand in the mailbox. parth-kp's webhook calls cannot be undone, and parth-kp keeps no action log. Jevmail and spam-leadgen change nothing in the mailbox. Tests in the repositories: Jevmail (classify.test.ts), ilyamk (a release-audit test), parth-kp (7 test files), vynnlee (7 test files); spam-leadgen tests parsing only, not classification. One row per project is also on the products ledger.

What each sorter sends to Jev

Most email body characters sent to Jev per email (code limit)

  • vynnlee jev-mail1,000
  • Jevmail2,000
  • spam-leadgen-pipeline4,000
  • ilyamk (full-body stage)5,000
  • parth-kpNo cut
The scale runs from 0 to 5,000 characters. The dashed bar means no limit: parth-kp sends the whole first plain-text part of the email, and an HTML-only email arrives as an empty body. vynnlee also adds 500 characters of the previous message when the body is under 200 characters. ilyamk's first stage sends headers and the snippet only. Documented 3 Oct 2026.
ProjectBesides the bodyRoute
JevmailSender name and address, subject, received time, unsubscribe header yes/no, "previously replied" yes/noVercel AI Gateway, model typesafe-ai/jev
ilyamkFrom, to, cc, reply-to, subject, date, list headers and others, each up to 512 characters; snippet up to 1,200OpenRouter, ~typesafe/jev-latest
parth-kpSubject only; the sender is not sentTypeSafe direct (jev-latest), else OpenRouter or Vercel
vynnleeSender, recipient, subjectTypeSafe direct, jev-latest
spam-leadgenSender name, address and domain, subjectOfficial SDK @typesafe-ai/sdk, SDK default model

Data and permissions

  • Emails are personal data, both about the sender and about the mailbox owner. All five send subject text or sender details to Jev, and 4 of 5 send the sender's address (parth-kp does not). Work through the data checklist before connecting a real inbox.
  • Mailbox access requested: vynnlee asks for the full https://mail.google.com/ scope. parth-kp has full IMAP access through an app password. Jevmail and spam-leadgen ask for gmail.readonly. The scope ilyamk is granted is unknown, because the repository has no appsscript.json manifest. Sorting by label alone needs neither full access level.
  • The route changes which data terms apply. As checked on 3 Oct 2026 at 05:16 UTC: Jevmail calls Vercel AI Gateway, whose only listed Jev endpoint is DigitalOcean with has_zdr: false (Vercel route). ilyamk calls OpenRouter, whose TypeSafe endpoint is on OpenRouter's zero-data-retention list (OpenRouter route). Documented
  • No Google API policy text was read for this page, so none is quoted.

Cost per 1,000 emails

Jev's price is $0.042 per million input tokens, and output is free. Documented TypeSafe models page, rechecked . OpenRouter, Vercel and Cloudflare list the same price. New accounts get no free credit (access status), so even a first test on 1,000 emails is charged at this price.

Pool arithmetic on the documented price

Assumptions, made by the pool and not by TypeSafe: about 4 characters per token for English text, because TypeSafe does not publish a ratio in the pages read. Plus 500 tokens per call for the question text, because the pages read do not say whether question text is billed as input. The maximum assumes every email reaches the project's body limit.

ProjectMost characters sent per emailApprox. input tokensMax cost per 1,000 emails
vynnlee jev-mail1,000 body + 500 previous + ~200 headers~925~$0.039
Jevmail2,000 body + ~200 headers~1,050~$0.044
spam-leadgen-pipeline4,000 body + ~200 sender fields~1,550~$0.065
ilyamk (two calls when unsure)~2,500 metadata + 5,000 body + ~2,500 metadata again~3,500~$0.147
parth-kp (no cut)Whole first text part, up to Jev's 32k-token state limitup to ~32,000up to ~$1.34

Range: about $0.025 per 1,000 very short emails (about 100 tokens of email plus the 500-token question allowance: 600 tokens × 1,000 × $0.042 per million), $0.04–$0.15 per 1,000 at the limits of the four projects that cut the body, and up to $1.34 per 1,000 if every email filled Jev's 32k state limit (parth-kp sends the body uncut). Documented price pool arithmetic

Show one calculation (Jevmail)

2,000 body + ~200 header characters ÷ 4 = ~550 tokens, + 500 for the question text = ~1,050 tokens per email. 1,000 emails × 1,050 = 1.05 million tokens × $0.042 = ~$0.044.

Reported demo figure, for comparison

"1,700 emails for $0.18"

Reported Isenberg with Vogel, 18 Sep 2026, YouTube 4mTLpuQpB80 at 4:32. Taken from the pool's audience findings; not re-watched for this page.

That works out to $0.106 per 1,000 emails. At $0.042 per million, it would mean about 2,520 input tokens per email (pool arithmetic on the reported figure).

TypeSafe launched on 15 Sep, and the pool first recorded the $0.042 price on 20 Sep. No different earlier price has been found. The demo's code, inputs and questions are not public, so the figure cannot be checked.

To work out your own cost from your token counts, use the cost per decision worksheet.

Seven rules for sorting email with Jev, and which projects follow them

  1. Ask for the narrowest mailbox permission.

    Sorting by label does not need https://mail.google.com/ or full IMAP access. 2 of 5 work with read-only access.

    Jevmail, spam-leadgen: read-onlyvynnlee, parth-kp: full accessilyamk: unknown
  2. Send unsure mail to a visible "Review" label and keep it in the inbox.

    This is better than applying a label anyway or skipping the email for good.

    vynnleeilyamk: labels anywayparth-kp: never re-checked
  3. On a Jev error, change nothing in the mailbox and retry later.

    All 5 already change nothing in the mailbox; keep it that way. How to handle rate limits is on errors and rate limits.

    All 5
  4. Check the answer before acting on it.

    Accept only known categories and probabilities between 0 and 1.

    ilyamk, vynnleeJevmail: unknown becomes "promotional"parth-kp: no range check
  5. Cut the body before sending.

    A limit caps both the cost and the amount of personal data sent.

    4 of 5parth-kp: no cut
  6. Start in preview or dry-run mode, and keep a log of actions.
    ilyamk: preview by defaultparth-kp: live by default, no log
  7. Treat outbound actions as irreversible.

    Put stricter checks on webhooks and CRM writes than on labels.

    parth-kp: webhookspam-leadgen: lead records without confirmation

These rules are a design reading of the source code above, not a measured result. How to set thresholds: confidence thresholds.

What belongs on this page and what does not

  • Personal and sales inboxes and leads are covered here. Help-desk tickets are on support-ticket triage.
  • Which n8n node to install is on Jev in n8n. The n8n Gmail-leads workflow shown in Stephanie Nyarko's video (24 Sep) was not read as a project for this page.

How the five were chosen and read

On , a GitHub repository search for "jev email OR jev gmail OR jev inbox" returned 59 results. That is a count of indexed repositories, not of users. The four with the most stars were read: fazlerocks/jevmail (93 stars), ilyamk/jev-gmail-ai-spam-filter-and-labeling (22), parth-kp/jev-mail-classifier (19) and vynnlee/jev-mail (10). The pool added automatewithuday/spam-leadgen-pipeline (0 stars, created 2 Oct), the one lead-side project with a Jev call path found in that day's 24-hour scan. A second search, "jev lead OR jev crm OR jev outlook" (8 results), found Outlook sorters but no lead-scoring or CRM project. This is a reading order, not a sample: stars do not measure how many people use a project.

Each project was pinned to one commit and read from source. The runner read Jevmail. It was audited on 28 Sep from its moving main branch and is now pinned at f6f20af (last commit 19 Sep, so the classifier has not changed since then). A helper agent read the other four. The runner then spot-checked them against the raw files at the same commits at 05:25 UTC, without re-reading every line. Nothing was installed or run, no mailbox was connected and no Jev call was made.

Not read: atomiclabs-tech/atomic-inbox (no Jev call path at aa7d056), anshulkhare7/jev-gmail-triage (its description says it labels mail with an LLM through OpenRouter), withoneai/mastra-inbound-router (a lead-routing candidate, not reached in time) and 50+ smaller repositories. Email demo videos are in the email videos group.

What was not verified

  • The OAuth scope ilyamk is actually granted: the repository has no manifest.
  • How spam-leadgen behaves without a key, and which model it uses: both are decided inside the SDK, which was not read.
  • HTTP timeouts for Jevmail, ilyamk and vynnlee: none is set in code, so platform defaults apply, and those were not checked.
  • Whether question text is billed as input, and how many characters make a token. Both are assumptions in the cost table.
  • The inputs behind the demo's "1,700 emails for $0.18".
  • The four projects read by the helper agent were spot-checked, not re-read line by line. The line references in the sources below allow each cell to be checked.
  • How any of the five behaves in real use: none was run, and none is confirmed as working. How many people use them is also unknown.

Corrections

  • 4 Oct 2026, wording: Jevmail's unsure cell now reads "acts-anyway (flagged)" (was "advisory"), spam-leadgen's reads "fallback: not qualified" (was "fail-closed"), and vynnlee's reads "held: Review label" (was "fallback: Review label"). These are relabels under the pool's 4 Oct below-threshold terms; the behaviour read in source is unchanged (4 Oct report).
  • 4 Oct 2026, cost: the low end of the range now reads "about $0.025 per 1,000 very short emails". Until 4 Oct it led with "about $0.004", which left out the 500-token question allowance that the table's own rows include. The runner confirmed the arithmetic: $0.042 per million × 600 tokens × 1,000 = $0.0252.

Sources and check times (3 Oct 2026, UTC)

  • Jevmail at f6f20af (05:19): src/lib/classify.ts L1–160, src/auth.ts L5–8, src/lib/drainer.ts L71–99 and L149–155, src/lib/env.ts, src/lib/gmail/parse.ts L59–92. Read by the runner.
  • ilyamk at ade42bf (05:21): CODE.gs L18–25, L1654, L1720–1726, L2050–2086, L2437–2438, L3113–3122, L3957–4087, L4257–4307, L4499–4607. Spot-checked 05:25.
  • parth-kp at db96194 (05:21): jev_mail/cli.py L40–83 and L131–137, mailbox.py, actions.py, providers/*.py, base.py, config.py. Spot-checked 05:25.
  • vynnlee at 61e346f (05:22): src/gas/worker.ts L16, L65–74, L200–227, L249–262, L273, L306–354; src/core/index.ts L92–191; scripts/build.mjs L10. Spot-checked 05:25.
  • spam-leadgen-pipeline at 78a7592 (05:22): src/classify.ts L2–122, src/auth.ts L11, src/ingest.ts L17–44, schema.sql. Spot-checked 05:25.
  • Price: TypeSafe models page (05:16), $0.042 per million input tokens, output free.
  • Selection: GitHub repository searches "jev email OR jev gmail OR jev inbox" (59 results) and "jev lead OR jev crm OR jev outlook" (8 results), sorted by stars (05:19).
  • Query wording: Google suggest for "jev email" (05:22:12), first suggestion "jev email classifier". YouTube, Bing and DuckDuckGo checked at 05:22:12–05:22:13 offered no Jev email suggestion. "jev gmail", "jev inbox", "jev lead" and "jev email sorting" gave no relevant suggestion on any of the four.
  • Demo figure: Isenberg with Vogel, 18 Sep 2026, YouTube 4mTLpuQpB80 at 4:32, from the pool's audience findings of 28 Sep (not re-watched).

Search published pools, pages, reports, and evidence.