The Melmac models.
Small models for the steps that repeat. Each one does a single job, and the runtime decides which one runs it.
Melmac-S
LiveReads technical text from PDFs.
Turns spec sheets and manuals into structured records. The one in the demo.
Melmac-SV
LiveReads text, tables, charts and drawings.
The same job, with the visual page included.
Melmac-Phone
Coming soonNoisy calls, human speech.
Handles real call audio and replies in a natural voice.
Melmac-Narrator
Coming soonNarration at speed.
Long-form narration, fast and cheap.
Melmac-Email
LiveOutbound email, reviewed by you.
Drafts from the record and waits for your read.
Melmac-Crawl
Coming soonCrawl jobs, planned and run.
Plans the crawl, fetches the pages and keeps the queue.
One page in, one schema out.
Point S at a spec sheet. It reads the text, decides the fields and returns a schema. A dry run prints the schema without calling the model, so the shape is reviewable before anything is extracted.
$ ./melmac data/synth-spec/docs/d00000/page-1.pdf --dry-run page-1.pdf page 1 · 35 words, image 28bebee00d136f15.png schema: product_data_sheet / model_number, airflow, weight, afue, phase, certification, dimensions, input { "doc_type": "product_data_sheet", "fields": [ { "name": "model_number", "type": "string", "unit": null, "description": "The unique identifier for the product model." }, { "name": "airflow", "type": "number", "unit": "CFM", "description": "The volume of air moved by the furnace." }, { "name": "weight", "type": "number", "unit": "lb", "description": "The total weight of the unit." }, { "name": "afue", "type": "number", "unit": "%", "description": "The Annual Fuel Utilization Efficiency percentage." }, { "name": "phase", "type": "number", "unit": null, "description": "The electrical phase of the unit." }, { "name": "certification", "type": "string", "unit": null, "description": "The official certification standard met by the product." }, { "name": "dimensions", "type": "string", "unit": "in", "description": "The physical dimensions of the unit." }, { "name": "input", "type": "number", "unit": "Btu/h", "description": "The heat input capacity of the furnace." } ] }
A dry run on a synthetic spec sheet. The next step fills each field from the page.
More models.
Phone, Narrator and Crawl are coming soon.
$ ./melmac chat "What is the model number and weight?" --model melmac-sv --image page-1.pdf loaded models/Melmac-SV Model Number: KH-270A Weight: 435
$ ./melmac chat "Confirm the HVAC unit is on backorder until Friday." --model email-270m
The HVAC unit is on backorder until Friday.
$ ./melmac transcribe call_00.wav --model phone agent Hello, thank you for calling. My name is Michael. customer I noticed a double charge on my last bill. agent I see you were charged twice this month.
$ ./melmac speak "Line three is down. Maintenance is on it." --voice narrator ▶ line-three.wav 2.4s 24 kHz
$ ./melmac crawl https://example.com/catalog --depth 2 → fetch /catalog 200 → links 38 found → queue /catalog/valves 12 pages → done 12 pages · 0 errors
The runtime picks the model.
A step that reads a PDF goes to S. A page with a chart goes to SV. If a step fails, the Controller reroutes it to a model that can finish it.
Gemini, Qwen, GLM, Kimi, Meta, Mistral, IBM.
Open weights and frontier models sit behind the same interface. Where a model runs is a deployment choice, not a rewrite.
Have a task? Get a quote.
One price, agreed before anything runs. You pay when it is done.