Recipes

These are copy-paste workflows that pipe Less Software tools together — and sometimes into sqlite3, jq, strip-tags, or llm — to do surprisingly useful things. Everything runs locally. No API keys, no cloud, no heavy runtimes.

Click any recipe to see the command and example output.

Web & Text

Detect language for a webpage
tezcatl · lingua ●○○
Render a JavaScript-heavy page with tezcatl, strip the HTML tags, and detect the language. Works on SPAs that curl can't reach.
$ tezcatl https://less.software | strip-tags | lingua detect
en [1.00]
Extract emails from a webpage
tezcatl · lingua ●○○
Scrape a rendered page and extract email addresses using native macOS NLP. Swap --type=email for phone, address, or date to find other entity types.
$ tezcatl https://george.mand.is/contact | lingua entities --type=email --json
[{"type":"email","value":"[email protected]","range":[3790,14]}]
Requires: tezcatl, lingua
Sentiment-check a webpage's copy
tezcatl · lingua ●●○
Strip the HTML, then run sentence-level sentiment analysis on the text. Useful for checking tone on landing pages or blog posts you're drafting.
$ tezcatl https://less.software | strip-tags -m | lingua sentiment --per-sentence --json
[{"text":"Less Software is an independent practice...","score":-0.80}, {"text":"Developer tooling and workflows...","score":0.80}, {"text":"I work with teams to reduce unnecessary complexity...","score":0.20}, ...]
Translate any JS-rendered page locally
tezcatl ●●○
Render a foreign-language page, strip the markup, and translate it entirely on-device using llm with a local model. No Google Translate, no API keys.
$ tezcatl https://www3.nhk.or.jp/news/ | strip-tags -m | llm -m apple "translate this to English"
1. Miyazaki, Tsushima City issues evacuation orders for 712 households due to rain and rising rivers. 2. A line of precipitation is expected to develop in southern Japan this morning... ...
Requires: tezcatl, strip-tags, llm

Audio & Speech

Transcribe audio and extract action items
stenographer ●●○
Transcribe an audio file and pipe the text to a local LLM to pull out action items. Meeting notes without a SaaS subscription.
$ stenographer transcribe meeting.m4a | llm -m apple "extract action items as a JSON array"
[ "Sarah will update the design docs by Friday", "Mike needs to fix the login bug before the release", "Everyone should review the pull request for the new API" ]
Requires: stenographer, llm
Identify what language someone is speaking
stenographer · lingua ●○○
Transcribe speech from an audio file, then detect which language it's in. Two native macOS APIs, one pipe.
$ stenographer transcribe audio.m4a | lingua detect
es [1.00]
Requires: stenographer, lingua
Classify the sounds in an audio file
cacophony ●○○
Identify sounds in an audio file from 303 built-in categories — speech, music, sirens, birds, mechanical noise, and more.
$ cacophony classify audio.wav --json --top=5
[{"label":"speech","confidence":0.97}, {"label":"sigh","confidence":0.56}, {"label":"click","confidence":0.45}, {"label":"mosquito_buzz","confidence":0.41}, {"label":"breathing","confidence":0.38}]
Requires: cacophony

Location & Local Data

Find coffee near you
whereami · nearme ●○○
Get your coordinates from the OS and search for nearby coffee shops, all without touching an API key or opening a browser.
$ whereami --json | nearme "coffee"
1. Cafe Imael (cafe) 1090 St Johns Pl, New York, NY 11213 +1 (718) 758-5857 · 485 m 2. Bakerie (cafe) 252 Albany Ave, Brooklyn, NY 11213 +1 (718) 693-8248 · 489 m 3. Rosalia's Cafe (cafe) 615 Nostrand Ave, Brooklyn, NY 11216 +1 (718) 758-4640 · 568 m
Requires: whereami, nearme
Two-line pizza database
whereami · nearme ●●○
Get your location, find 25 pizza places nearby, and pipe the results straight into a SQLite database. Two commands, zero API keys, a real queryable database of pizza.
$ whereami --json | nearme "pizza" --csv --count=25 | \ sqlite3 pizza.db ".mode csv" ".import /dev/stdin places"
$ sqlite3 pizza.db "SELECT name, address, phone FROM places LIMIT 5"
New Kingston Pizza|259 Kingston Ave, New York, NY 11213|+1 (718) 774-7665 Domino's Pizza|1479 Fulton St, New York, NY 11216|+1 (718) 221-4800 Brooklyn Pizza Crew|758 Nostrand Ave, Brooklyn, NY 11216|+1 (718) 363-1122 Not Just Pizza|1286 Fulton St, New York, NY 11216|+1 (718) 783-8015 Rocco Pizza III|330 Halsey St, Brooklyn, NY 11216|+1 (718) 573-9200
Requires: whereami, nearme, sqlite3
Walking tour generator
whereami · nearme ●●○
Search for museums near your current location and ask a local LLM to plan a walking route between them. Location-aware itinerary, entirely on-device.
$ whereami --json | nearme "museums" --json | llm -m apple "plan a walking route visiting these places"
Start at the Brooklyn Children's Museum at 145 Brooklyn Ave. Walk west to the Cultural Museum of African Art at 1360 Fulton St. Proceed to the Crown Heights Cultural Fine Arts Center at 1218 Union St. Conclude at the Brooklyn Museum on 200 Eastern Pkwy.
Requires: whereami, nearme, llm

Vision & Structured Data

Business card scanner
loupe · lingua ●●○
OCR a photo of a business card and extract structured contact info — phone numbers, emails, addresses — using native macOS NLP. No multimodal model needed.
$ loupe ocr card.jpg | lingua entities --json
[{"type":"email","value":"[email protected]","range":[39,18]}, {"type":"phone","value":"+1 (415) 555-0123","range":[58,17]}, {"type":"address","value":"123 Market St, San Francisco, CA 94105","range":[76,38]}]
Requires: loupe, lingua
Make calendar entry from an event flyer
loupe ●●●
Grab a screenshot of an event flyer, OCR the image, and extract structured event details via a local LLM. Vision without a vision model — for more complex designs, pass the image to a multimodal model directly.
$ screencapture -i event.png && loupe ocr event.png | \ llm -m apple "extract event details" \ --schema '{"type":"object","properties":{"title":{"type":"string"}, "date":{"type":"string"},"time":{"type":"string"}, "venue":{"type":"string"},"location":{"type":"string"}}, "required":["title","date","time","location"]}'
{"title":"Brooklyn Synth Meetup", "date":"Saturday, July 12, 2026", "time":"7:00 PM - 10:00 PM", "venue":"The Bell House", "location":"149 7th St, Brooklyn, NY 11215"}
Requires: screencapture (macOS), loupe, llm
Receipt OCR with structured total
loupe ●●○
Take a photo of a receipt, OCR it, and extract the store, line items, and total as structured JSON. Schema enforcement means clean data every time.
$ loupe ocr receipt.jpg | llm -m apple "extract store info and itemized receipt" \ --schema '{"type":"object","properties":{"store":{"type":"string"}, "items":{"type":"array","items":{"type":"object","properties": {"name":{"type":"string"},"price":{"type":"number"}},"required": ["name","price"]}},"total":{"type":"number"}},"required": ["store","items","total"]}'
{"store":"Corner Grocery", "items":[{"name":"Oat Milk","price":5.99}, {"name":"Sourdough","price":6.50}, {"name":"Avocados x3","price":4.50}, {"name":"Coffee Beans","price":14.99}], "total":34.82}
Requires: loupe, llm

Automation

Clipboard language detector hotkey
fulton · copycat · lingua ●●○
Bind a global hotkey that reads your clipboard and tells you what language the text is in. Press a key, get an answer.
$ fulton --key "cmd+shift+l" --exec \ "copycat read public.utf8-plain-text | lingua detect"
# Copy some French text, press Cmd+Shift+L: fr [0.99]
Requires: fulton, copycat, lingua
Hotkey: summarize your clipboard
fulton · copycat ●●○
Bind a global hotkey that reads whatever text is on your clipboard and summarizes it in one sentence using a local LLM. Copy an article, press the key, get the gist.
$ fulton --key "cmd+shift+s" --exec \ "copycat read public.utf8-plain-text | llm -m apple 'summarize in one sentence'"
The Federal Reserve decided to keep current interest rates stable, citing ongoing inflation concerns while planning to review data for potential rate cuts later if inflation eases.
Requires: fulton, copycat, llm
Hotkey: translate your clipboard
fulton · copycat ●●○
Copy foreign text, press a hotkey, get a translation with the detected language. Uses structured output so the result is always clean JSON.
$ fulton --key "cmd+shift+t" --exec \ "copycat read public.utf8-plain-text | llm -m apple \ 'detect the language and translate to English' \ --schema '{\"type\":\"object\",\"properties\":{\"language\":{\"type\":\"string\"},\"translation\":{\"type\":\"string\"}},\"required\":[\"language\",\"translation\"]}'"
{"language":"French", "translation":"The President has announced a new economic plan to boost growth. The measures include tax cuts for small businesses and an investment of 50 billion euros."}
Requires: fulton, copycat, llm
Hotkey: extract todos from your clipboard
fulton · copycat ●●○
Copy a message or meeting notes, press a hotkey, get structured action items with deadlines. Schema enforcement means you always get parseable JSON back.
$ fulton --key "cmd+shift+d" --exec \ "copycat read public.utf8-plain-text | llm -m apple \ 'extract todos' --schema-multi '{\"type\":\"object\",\"properties\":{\"task\":{\"type\":\"string\"},\"deadline\":{\"type\":\"string\"}},\"required\":[\"task\"]}'"
{"items":[ {"task":"Finalize the API docs","deadline":"Friday"}, {"task":"Set up the staging environment","deadline":"Wednesday"}, {"task":"Follow up with design team about new icons"}, {"task":"Submit timesheets","deadline":"end of day"} ]}
Requires: fulton, copycat, llm
Extract entities from your clipboard
copycat · lingua ●○○
Copy any text, then pull out phone numbers, emails, addresses, and dates in one command. Handy for grabbing contact info from emails or web pages without reaching for a regex.
$ copycat read public.utf8-plain-text | lingua entities --json
[{"type":"phone","value":"(718) 555-0142","range":[14,14]}, {"type":"email","value":"[email protected]","range":[45,17]}, {"type":"address","value":"350 5th Ave, New York, NY 10118","range":[81,31]}, {"type":"date","value":"June 15th","range":[116,9]}]
Requires: copycat, lingua
Scrape, detect, translate, summarize
tezcatl · lingua ●●●
Render a foreign-language page, strip the HTML, detect the language, then translate and summarize in three bullets. Five tools, one pipeline, all local.
$ tezcatl https://www3.nhk.or.jp/news/ | strip-tags -m | lingua detect && \ tezcatl https://www3.nhk.or.jp/news/ | strip-tags -m | llm -m apple "translate to English and summarize in 3 bullets"
ja [1.00] - Evacuation orders issued in Miyazaki due to heavy rain and flooding - Precipitation line expected across southern Japan through afternoon - Trump administration considering visa changes for athletes
Voice to structured action items
stenographer ●●●
Speak your to-do list into the mic, then extract structured action items via a local LLM with schema enforcement. No typing, no SaaS, just speech to JSON.
$ stenographer listen --json --no-stream | jq -r '.text' | \ llm -m apple "extract action items" \ --schema-multi '{"type":"object","properties":{"task":{"type":"string"},"assignee":{"type":"string"}},"required":["task"]}'
{"items":[ {"task":"go to the grocery store to buy salad stuff","assignee":"you"}, {"task":"fix the résumé for the head of engineering job","assignee":"you"} ]}
Requires: stenographer, jq, llm

Ideas & Directions

These are less-tested ideas that hint at where composable CLI tools could go. Some are waiting for refinements to the tools. Others are just waiting for someone to try them.

Share Your Recipes

If you come up with a recipe using these tools, I'd love to hear about it. Drop me a line at [email protected].