Skip to content

vellum

Experimental Markdown-to-Sanity mapper where Jev picks which source block fills each field and code copies it, generating no text.

Projectprototype

Overview

Vellum maps Markdown into Sanity CMS documents with a classifier instead of an LLM. Code splits the source into blocks with ids and asks Jev Choice questions such as "Which block supplies the post's title?", with an explicit __none__ option when nothing fits. Code then copies the chosen content into fields, converts the rest to Portable Text and runs Sanity validation.

Because Jev cannot produce text, it cannot invent a slug, shorten a title or paraphrase; if the source lacks a value, the best it can do is pick __none__, and a missing required field surfaces as a validation error. A sample post takes about 20 requests. The README warns that it is an experiment: mapping is incomplete on real documents, the API changes without notice, and the same input can map differently twice in a row.

What the decision model decides

TypeQuestionAnswers
ChoiceWhich block supplies the post's title?B000 · B001 · ... · __none__
Yes / noDoes this block belong in this field?(inferred)yes · no

How it works

  1. Split Markdown into id-tagged blocks.
  2. Ask Jev which block supplies each field, with a __none__ option.
  3. Copy chosen content; convert the body to Portable Text.
  4. Run Sanity validation and return a document.

Strengths

  • No generated text; values come only from the source.
  • Missing values surface as validation errors.
  • Hosted demo available.

Caveats

  • Experimental; mapping incomplete on real documents.
  • Results can vary between runs.

Getting started

Try it at https://vellum.sanity.dev

At a glance

Type
Project
Status
prototype
Language
TypeScript
Runtime
web app
Has code
yes

Use cases and integrations

How curated lists describe it

  • Markdown to Sanity documents, with a classifier instead of an LLM. Jev decides, code copies. Experimental.

    hellogumbo/awesome-jev

Frequently asked questions

Can Vellum invent content?

No, Jev only picks source blocks; code copies them.

What if a field is missing from the source?

Jev picks __none__ and Sanity validation reports the missing field.

Is it production-ready?

No, it is an experiment.

Related projects

  • Windows office workbench with search, OCR and batch renaming, where Jev optionally helps pick extracted contract fields.

    ProjectbetaRust
  • Classifies tax PDF pages into 261 IRS forms and 7 page kinds with one Jev request per page and a confidence gate.

    ProjectproductionTypeScript
  • Rust tool that asks Jev which PDF pages genuinely need OCR, extracting text pages locally and sending only the rest to OCR.

    ProjectbetaRust
  • Local library that turns an image into a transparent text state (OCR, boxes, labels) so Jev can decide over screenshots.

    ProjectbetaPython
  • Docker service that classifies the Paperless-ngx inbox with Jev (or local Clef via Ollama), setting confident fields and queueing the rest.

    Projectbeta
  • Long-document search that walks a PageIndex tree, asking Jev Choice which page or branch answers the question, with no embeddings.

    ProjectprototypePython