Skip to content
Earlyn

Gallery

Agents and plugins to start from. Agents are plain Markdown; plugins are small programs you can read here before you download them.

Agents

Download the file, then Settings → Automation → Agents → Import .md. Nothing runs until you turn the agent on.

Customer mentions

When “churn” appears

Someone mentioned churn. Summarize where it came up, which customer or account, what was said, and what I might need to do about it.

Download customer-mentions.md

Receipts and invoices

On a schedule (weekly mon 09:00)

Find every receipt, invoice, order confirmation or subscription charge I saw last week: vendor, amount with currency, date, and where I saw it. A table, newest first. Only what really appears.

Download expense-spotter.md

Focus coach

On a schedule (daily 18:00)

Look at how my day went: my longest focused stretch, what pulled me away most often, and one concrete, kind suggestion for tomorrow. Four sentences at most.

Download focus-coach.md

Interview debrief

When a meeting ends

If this was a job interview, write a debrief: the candidate's strengths and concerns with the evidence heard, how each question was answered, and a hire / no hire / unsure lean with one line why. If it was not an interview, say so in one line.

Download interview-debrief.md

Weekly reading list

On a schedule (weekly fri 16:00)

List the articles, docs and videos I actually spent time on this week, grouped by topic, each with its title, the link if one appears, and one line on what it was about. Skip anything I only glanced at.

Download reading-list.md

Plugins

Download the zip, open it, then Settings → Automation → Plugins → Install folder…. Earlyn shows you the program and runs it only after you approve it. Pick the plugin as an agent's Send to.

Copy to clipboard

Download clipboard.zip

Puts the agent's output on the clipboard, ready to paste.

Comes with the agent “Standup draft” (added turned off).

Read the program (main.sh)
clipboard/main.sh
#!/bin/sh
/usr/bin/python3 -c 'import json,sys; sys.stdout.write(json.load(sys.stdin)["output"])' | /usr/bin/pbcopy
echo "Copied."

Appends every run to a Markdown journal in your Documents folder.

Writes to ~/Documents/Earlyn journal.md. Change JOURNAL in main.sh to use another file.

Comes with the agent “Evening journal” (added turned off).

Read the program (main.sh)
journal/main.sh
#!/bin/sh
JOURNAL="$HOME/Documents/Earlyn journal.md"
/usr/bin/python3 - "$JOURNAL" <<'PY'
import json, sys, datetime
data = json.load(open("/dev/stdin"))
with open(sys.argv[1], "a", encoding="utf-8") as f:
    f.write(f"\n## {data['title']}\n\n{data['output'].strip()}\n")
print("Added to", sys.argv[1])
PY

Looks up what else you saw about the output's topics through the local API and appends links to the journal.

Needs the local API (Settings → Connect → Local API); Earlyn passes its address and token to the plugin.

Read the program (main.py)
related-reading/main.py
#!/usr/bin/python3
import json, os, sys, urllib.parse, urllib.request
data = json.load(sys.stdin)
api, token = os.environ.get("EARLYN_API_URL"), os.environ.get("EARLYN_API_TOKEN")
if not api:
    sys.exit("Turn on the local API in Earlyn → Settings → Connect.")
words = [w.strip(".,:;()") for w in data["output"].split() if w[:1].isupper() and len(w) > 4][:5]
links = {}
for word in words:
    request = urllib.request.Request(f"{api}/v1/search?" + urllib.parse.urlencode({"q": word, "limit": 5}), headers={"Authorization": f"Bearer {token}"})
    for hit in json.load(urllib.request.urlopen(request, timeout=20)):
        if hit.get("url"):
            links[hit["url"]] = hit["title"]
path = os.path.expanduser("~/Documents/Earlyn journal.md")
with open(path, "a", encoding="utf-8") as f:
    f.write(f"\n### Related reading for {data['title']}\n\n" + "\n".join(f"- [{t}]({u})" for u, t in list(links.items())[:10]) + "\n")
print(f"{len(links)} links")

Reads the first lines of the agent's output aloud with the Mac's voice.

Uses the Mac's built-in say command. Nothing leaves the Mac.

Comes with the agent “Spoken meeting recap” (added turned off).

Read the program (main.sh)
say-it/main.sh
#!/bin/sh
# Input: JSON on stdin with agent, trigger, title, output, period.
/usr/bin/python3 -c 'import json,sys; o=json.load(sys.stdin)["output"]; print("\n".join(o.splitlines()[:3]))' | /usr/bin/say
echo "Spoke the first lines."

Adds every "- [ ] …" line of the output to Things as a to-do.

Needs Things 3 installed. Uses its things:/// URL scheme; nothing leaves the Mac.

Comes with the agent “Meeting to-dos to Things” (added turned off).

Read the program (main.sh)
things-todos/main.sh
#!/bin/sh
/usr/bin/python3 <<'PY'
import json, re, subprocess, sys, urllib.parse
data = json.load(open("/dev/stdin"))
todos = [m.group(1).strip() for m in re.finditer(r"^\s*[-*] \[ \] (.+)$", data["output"], re.M)]
for todo in todos:
    subprocess.run(["/usr/bin/open", "-g", "things:///add?" + urllib.parse.urlencode({"title": todo, "notes": data["title"]}, quote_via=urllib.parse.quote)])
print(f"Added {len(todos)} to-dos to Things.")
PY

POSTs the output as JSON to a URL you put in url.txt (Zapier, Make, n8n, your own server).

This plugin sends the agent's output to the address in url.txt. That address is yours to choose; whatever you put there receives the text.

Read the program (main.sh)
webhook/main.sh
#!/bin/sh
URL_FILE="$EARLYN_PLUGIN_DIR/url.txt"
if [ ! -s "$URL_FILE" ]; then
  echo "Put the webhook address in $URL_FILE first." >&2
  exit 2
fi
/usr/bin/curl --fail --silent --show-error --max-time 20 -H 'Content-Type: application/json' --data-binary @- "$(head -n1 "$URL_FILE")" > /dev/null
echo "Posted."

Make your own

A plugin is a folder with plugin.md and any program with a #! line. It gets the agent's output as JSON on stdin. See the docs. Made something useful? Send it to us and we may add it here.