LYRENTH
AgentsDocsPricingBenchmarksIndex statsAboutBlogFor site ownersStatusContact
September 23, 2026 · agents · how-to · python

Four commands before a meeting

Agents that read the pages you hand them and return the finished job. Here is one morning of homework done in four runs, ending in a spreadsheet, with every command and every answer printed as it came back.

Every agent that touches the web does the same boring half first: fetch some pages, get usable text out of them, keep track of which page said what. Most of us write that half again for every job, and then write the interesting half, and then never look at the boring half again even though it decides how good the answer is.

So we wrote ten small agents that do whole jobs, and gave them all the same reading layer. Compare two products. Brief a company. Answer a question from documentation. Pull several pages into one table. One command each, free and open, and they run on your machine with your own model.

This post is one job done with four of them: the homework you do the morning before a meeting with a company. Every command below is a real command, and every answer is printed as it came back.

01. What do they actually do

uvx lyrenth-agents brief \
  https://www.mozilla.org/en-US/about/ \
  https://www.mozilla.org/en-US/about/manifesto/ \
  https://www.mozilla.org/en-US/careers/

Three pages, 6,664 tokens of text, and a brief in fixed sections: what they do, who it is for, what they sell, how they describe themselves, and what these pages never answered.

### Who it is for.
The site states that Mozilla's initiatives are intended to benefit everyone who
uses the internet [1][2]. Its open-source AI tools are designed for software
developers [2]. Its consumer products are built for people all over the world [2][3].

### What it sells.
Not stated on the pages given.

That second section is the one to notice. Three pages of a company's own words, and the honest answer about what they sell is that these pages do not say. An agent that guesses there would have cost you the meeting.

02. Who are you talking to

uvx lyrenth-agents people \
  https://www.mozilla.org/en-US/about/leadership/ \
  https://www.mozilla.org/en-US/careers/listings/

Two pages, 5,583 tokens, and out comes the leadership list and every open role, each line carrying the page it came from.

Who works there

- Mark Surman, President, Mozilla [1]
- Nabiha Syed, Executive Director, Mozilla Foundation [1]
- Anthony Enzor-DeMeo, CEO, Mozilla Corporation [1]

It closes with a sentence that matters more than the list:

These pages name 9 people; this is who the pages name rather than everyone
who works there.

The open roles are the part people skip. A company tells you what it is really building by what it is paying for.

03. How their product compares to the one you use

uvx lyrenth-agents compare \
  https://en.wikipedia.org/wiki/Firefox \
  https://en.wikipedia.org/wiki/Google_Chrome

Two long encyclopedia articles, 822,229 tokens of raw HTML between them, and one table of what is actually different:

| Available in | 97 languages [1] | 47 languages [2] |
| Engines | Gecko, Quantum, and SpiderMonkey; WebKit on iOS/iPadOS [1] | Blink (WebKit on iOS/iPadOS), V8 JavaScript engine [2] |
| Smart Window | Smart Window [1] | not stated on the pages given [2] |
| Dinosaur Game | not stated on the pages given [1] | Dinosaur Game [2] |

Every cell carries the number of the page it came from, and a cell that a page did not fill says so rather than borrowing the answer from somewhere else. The run also put this under the table, unprompted:

Note: It cannot be determined from the provided pages whether "usage share on
traditional PCs" [1] and "worldwide browser market share on personal computers" [2]
refer to the exact same metric.

Two numbers that look comparable and are not. That caution is worth more than the row above it.

04. Leave with a file, not fifteen tabs

The last run reads their three product pages and is asked for CSV:

uvx lyrenth-agents extract \
  -q "Write the table as CSV with a header row, one row per product, and nothing before or after the CSV." \
  https://www.mozilla.org/en-US/firefox/new/ \
  https://www.thunderbird.net/en-US/ \
  https://www.mozilla.org/en-US/products/vpn/
Product Name,Type,Supported Platforms,Privacy & Tracking,Price,Open Source,AI Policy,Source
"Firefox","fast, private browser","Windows 8.1 and below, macOS 10.14 and below, App Store, Google Play, desktop, mobile, tablet","Blocks trackers automatically, don’t sell your personal data","","","AI features are optional by design","[1]"
"Thunderbird","app","Android, Windows, Mac, Linux","don’t collect personal data, sell ads in your inbox","Free forever","open source","don’t secretly train AI with your private conversations","[2]"
"Mozilla VPN","virtual private network","Windows","No logging, tracking or sharing of network data","€4.99/month, €9.99/month","open source","","[3]"

Save it as products.csv and your spreadsheet opens it. The empty cells are the questions those pages did not answer, and the run said why the price column cannot be read straight across:

Price cannot be compared directly as Thunderbird is free forever [2], whereas Mozilla VPN is offered on monthly (€9.99/month) or annual (€4.99/month) billing periods [3].

What the four runs cost in reading

Ten pages were read in total. As raw HTML those ten pages weigh 1,020,262 tokens. What reached the models was 77,786, and in the comparison step even that was the budget talking: both encyclopedia articles are longer than the reading budget for one run, so each was trimmed to half of it and marked as trimmed everywhere it appeared.

Nothing about that is a trick of formatting. It is the same text a person reads, without the navigation, the cookie banners, the scripts and the markup that a browser needs and a model does not.

The part that makes the answers usable

Four habits, in every one of the agents:

  1. A number on every claim, and the page behind every number printed at the end, so a line you doubt is one click from its source.
  2. "Not stated on the pages given" instead of a plausible guess. It is the most useful sentence any of these agents writes.
  3. Failures out loud. A page that could not be read is listed with the reason. An answer never quietly comes back from fewer pages than you handed over.
  4. A budget that is shared. Every page gets its share of the reading budget, so one long page cannot crowd out the others, which is what turns a comparison into a table with one column filled in.

Running them yourself

One key and one command. The command runs with uv (brew install uv on a Mac); without uv, put pipx run in place of uvx:

export LYRENTH_API_KEY=...   # free key at https://lyrenth.com/signup
uvx lyrenth-agents compare \
  https://en.wikipedia.org/wiki/PostgreSQL \
  https://en.wikipedia.org/wiki/MySQL

With that key alone the agent reads the pages and prints the finished prompt with its numbered sources, ready to paste into whichever assistant you already use. Point it at any OpenAI-compatible endpoint and it answers on its own:

export LLM_BASE_URL=... LLM_MODEL=... LLM_API_KEY=...

Your model choice is yours, including a local one. Nothing in the loop belongs to us except the reading.

Writing your own

A recipe is data, not code: the instructions for the model and the shape of the output. Register one and it runs on the same engine, with the same reading, the same citations and the same failures out loud.

from lyrenth_agents import Recipe, get, register, run

register(Recipe(
    slug="changelog",
    name="Release notes",
    category="content",
    tagline="Turn release pages into one list of what changed.",
    what_you_give="The release or changelog pages, newest first.",
    what_you_get="One list of changes, newest first, with the page each came from.",
    system_prompt="You read release pages and list what changed...",
    output_hint="One list, newest first, with a source number on every line.",
    example_urls=["https://example.com/releases"],
))

result = run(get("changelog"), ["https://example.com/releases"])
print(result.answer or result.prompt)

The ten

Each one has its own page with a real captured run on it, printed exactly as it came back: lyrenth.com/agents. The code is at github.com/lyrenth/lyrenth-agents, MIT, and the whole library installs with one command.

If you build a recipe worth shipping, send it to us and we will add it.

All postsRead a URL in 5 minutes