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.
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.
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
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.readonlyand reads the spam folder. Without asking you, it writes classifications and aqualifiedflag 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-mailwith 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, inarchivemode 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 actions | Jev error or timeout | Unsure answer | Malformed answer | No key |
|---|---|---|---|---|---|
Jevmail (f6f20af)Next.js web app. Choice over 5 lanes, urgency Score, "is personal" boolean. Through Vercel AI Gateway | Read-only gmail.readonly. No mailbox actions; lanes are app records | no-decisionEmail stays unclassified and is retried next run. Repeated 429s pause the run; 403 stops it. 5xx retried once | acts-anyway (flagged)Top-two gap < 0.15 sets a lowConfidence flag; the lane is still assigned | fallback-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 OpenRouter | Labels, archive Scope not declared (unknown). Preview by default; jobs started from the UI, no timer | fail-closedOne retry wave, then the job pauses; 401/402/403 throw. No Gmail change | fallback-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.93 | no-decisionStrict check; one retry, then skipped as "Not assigned"; 3 in a row pause the job | fail-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 Vercel | Full IMAP Tag, move, flag, read state, webhook. Runs live with no arguments; no action log | fail-closedThe run stops; the current email is not marked processed. 15 s timeout, no retries | no-decisionBelow 0.6 no action, but marked processed and never checked again | fail-closed, with a gapMissing answer raises; probabilities are not range-checked | fail-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 direct | Full Gmail scope https://mail.google.com/. Label, star, archive (archive mode only). Runs on a timer once enabled | fail-closedRetry recorded with backoff from 1 min up to 6 h; Gmail untouched | held: Review labelUnsure action, bucket confidence < 0.6, or unknown choice: "Review" label, kept in the inbox | fail-closedInvalid JSON, missing or out-of-range values throw; same retry path | fail-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 model | Read-only gmail.readonly, spam folder. Writes lead records to Supabase without confirmation | fail-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 qualified | fail-closedMissing answer throws; a missing legit is written first, then throws | not 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)
| Project | Besides the body | Route |
|---|---|---|
| Jevmail | Sender name and address, subject, received time, unsubscribe header yes/no, "previously replied" yes/no | Vercel AI Gateway, model typesafe-ai/jev |
| ilyamk | From, to, cc, reply-to, subject, date, list headers and others, each up to 512 characters; snippet up to 1,200 | OpenRouter, ~typesafe/jev-latest |
| parth-kp | Subject only; the sender is not sent | TypeSafe direct (jev-latest), else OpenRouter or Vercel |
| vynnlee | Sender, recipient, subject | TypeSafe direct, jev-latest |
| spam-leadgen | Sender name, address and domain, subject | Official 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 forgmail.readonly. The scope ilyamk is granted is unknown, because the repository has noappsscript.jsonmanifest. 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.
| Project | Most characters sent per email | Approx. input tokens | Max cost per 1,000 emails |
|---|---|---|---|
| vynnlee jev-mail | 1,000 body + 500 previous + ~200 headers | ~925 | ~$0.039 |
| Jevmail | 2,000 body + ~200 headers | ~1,050 | ~$0.044 |
| spam-leadgen-pipeline | 4,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 limit | up to ~32,000 | up 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
- Ask for the narrowest mailbox permission.Jevmail, spam-leadgen: read-onlyvynnlee, parth-kp: full accessilyamk: unknown
Sorting by label does not need
https://mail.google.com/or full IMAP access. 2 of 5 work with read-only access. - Send unsure mail to a visible "Review" label and keep it in the inbox.vynnleeilyamk: labels anywayparth-kp: never re-checked
This is better than applying a label anyway or skipping the email for good.
- On a Jev error, change nothing in the mailbox and retry later.All 5
All 5 already change nothing in the mailbox; keep it that way. How to handle rate limits is on errors and rate limits.
- Check the answer before acting on it.ilyamk, vynnleeJevmail: unknown becomes "promotional"parth-kp: no range check
Accept only known categories and probabilities between 0 and 1.
- Cut the body before sending.4 of 5parth-kp: no cut
A limit caps both the cost and the amount of personal data sent.
- Start in preview or dry-run mode, and keep a log of actions.ilyamk: preview by defaultparth-kp: live by default, no log
- Treat outbound actions as irreversible.parth-kp: webhookspam-leadgen: lead records without confirmation
Put stricter checks on webhooks and CRM writes than on labels.
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.tsL1–160,src/auth.tsL5–8,src/lib/drainer.tsL71–99 and L149–155,src/lib/env.ts,src/lib/gmail/parse.tsL59–92. Read by the runner. - ilyamk at ade42bf (05:21):
CODE.gsL18–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.pyL40–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.tsL16, L65–74, L200–227, L249–262, L273, L306–354;src/core/index.tsL92–191;scripts/build.mjsL10. Spot-checked 05:25. - spam-leadgen-pipeline at 78a7592 (05:22):
src/classify.tsL2–122,src/auth.tsL11,src/ingest.tsL17–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).