Agent skill

Outlook

by vellum-ai in vellum-ai/vellum-assistant

Manage Outlook email — drafting, sending, organizing, rules, vacation replies, and inbox analysis

MITAuto-check: warningsProductivity & Automation

Install Outlook

The automated check flagged lines worth reading first. See the safety section below.

skills CLI
$ npx skills add vellum-ai/vellum-assistant --skill outlook -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install vellum-ai/vellum-assistant outlook --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/vellum-ai/vellum-assistant.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/outlook .claude/skills/outlook && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
outlook
GitHub stars
1.4k
Token cost
~3.9k tokens
SKILL.md length
1,679 words
Files
7 (incl. scripts, assets)
Skills in repo
108
Repo updated
First seen
Licence
MIT

At a glance

Manage Outlook email — drafting, sending, organizing, rules, vacation replies, and inbox analysis

  • Works in 2 steps: Check connection health first. Run… → If no connection is found or the ping…
  • Tasks that involve Email management
  • SKILL.md covers Script Reference, Email Routing Priority, Connection Setup and Error Recovery, plus 5 more sections
  • Runs TypeScript scripts from its folder; calls bun

What it does

Outlook is an agent skill from vellum-ai/vellum-assistant. Manage Outlook email — drafting, sending, organizing, rules, vacation replies, and inbox analysis

Its SKILL.md is about 3.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 9 other files, including scripts and assets (for example `scripts/lib/common.ts`, `scripts/lib/graph-client.ts` and `scripts/outlook-email.ts`). Compatibility notes: Designed for Vellum personal assistants

It sits in Productivity & Automation, covering Email management. It works with Microsoft Outlook. The repository describes itself as: An AI Assistant that’s easy to setup, does your work 24/7, knows your preferences and gets better over time. The licence is MIT.

When your agent uses it

  • Tasks that involve Email management

Example prompts

  • “/outlook”

Requirements

  • Node.js
  • Compatibility (from SKILL.md): Designed for Vellum personal assistants

Workflow steps

2 steps, taken from the first numbered list in SKILL.md.

  1. Check connection health first. Run assistant oauth ping outlook. This checks whether the user's Outlook/Microsoft account is connected and…
  2. If no connection is found or the ping fails: Load the vellum-oauth-integrations skill. The skill will evaluate whether managed or your-own…

What it can do on your machine

Read from SKILL.md and the folder at commit 33cc983. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships 5 files in scripts/ (TypeScript), which the agent can run.

    Shell commands in SKILL.md call:

    • bun

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

  • Compatibility

    Designed for Vellum personal assistants

    From compatibility in the SKILL.md frontmatter.

Context cost

Outlook loads about 3.9k tokens when it runs. Until then it costs about 26 tokens; SKILL.md has 1,679 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~26
When it runs · the whole SKILL.md, loaded when a task matches
~3.9k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check: warnings

The automated check found patterns that need a careful read before installing.

  • WarningContains instruction-override wording (e.g. “without asking the user”)SKILL.md:132
    - Do not tell the user a draft exists until the tool or script returns success with a `draftId`. If creation fails or is

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.

SKILL.md

The full file from vellum-ai/vellum-assistant at commit 33cc983, republished under its MIT licence (© vellum-ai). 1,679 words, ~3,873 tokens.

Download SKILL.mdSave it as .claude/skills/outlook/SKILL.md (or your agent's skills folder). This skill also uses 6 other files; get the full folder from GitHub.
name
outlook
description
Manage Outlook email — drafting, sending, organizing, rules, vacation replies, and inbox analysis
compatibility
Designed for Vellum personal assistants
metadata.icon
assets/icon.svg
metadata.emoji
📧

This skill provides Outlook-specific operations beyond the shared messaging skill. For cross-platform messaging (send, read, search, reply), use the messaging skill. Outlook operations depend on the messaging skill's provider infrastructure - load messaging first if Outlook is not yet connected.

Script Reference

All operations use CLI scripts that return JSON:

  • Success: { "ok": true, "data": ... }
  • Failure: { "ok": false, "error": "..." }
ScriptOperationDescription
outlook-email.tsdraftCreate email drafts in the Drafts folder (including reply drafts)
outlook-email.tssend-draftSend an existing draft (requires explicit user confirmation)
outlook-email.tsforwardCreate forward drafts, preserving attachments
outlook-email.tstrashMove messages to Deleted Items
outlook-manage.tscategoriesManage message categories (add, remove, list available)
outlook-manage.tsfollow-upTrack messages with Outlook's native flag system
outlook-manage.tsattachmentsList and download email attachments
outlook-manage.tsrulesCreate, list, and delete server-side inbox message rules
outlook-manage.tsvacationGet, enable, or disable auto-reply (out-of-office) settings
outlook-manage.tsunsubscribeUnsubscribe from mailing lists (requires explicit user confirmation)
outlook-scan.tssender-digestScan inbox and group messages by sender for declutter workflows
outlook-scan.tsoutreach-scanIdentify cold outreach senders (no List-Unsubscribe header)
Email Operations
bash
# Draft an email (--to is optional; omit it to create a draft with no recipient)
bun run scripts/outlook-email.ts draft --to "user@example.com" --subject "Hello" --body "Message body"
bun run scripts/outlook-email.ts draft --subject "Hello" --body "Message body"

# Send an existing draft (REQUIRES user confirmation before execution)
bun run scripts/outlook-email.ts send-draft --draft-id "AAMk..."

# Forward a message
bun run scripts/outlook-email.ts forward --message-id "AAMk..." --to "recipient@example.com" --comment "FYI"

# Trash a message
bun run scripts/outlook-email.ts trash --message-id "AAMk..."
Management Operations
bash
# Categories - add categories to a message
bun run scripts/outlook-manage.ts categories --action add --message-id "AAMk..." --categories "Blue Category,Important"

# Follow-up - flag a message for follow-up
bun run scripts/outlook-manage.ts follow-up --action track --message-id "AAMk..."

# Attachments - list attachments on a message
bun run scripts/outlook-manage.ts attachments --action list --message-id "AAMk..."

# Rules - create a server-side inbox rule
bun run scripts/outlook-manage.ts rules --action create --name "Archive newsletters" --conditions '{"senderContains":["newsletter"]}' --actions '{"moveToFolder":"Archive"}'

# Vacation - enable auto-reply
bun run scripts/outlook-manage.ts vacation --action enable --internal-message "I'm out of office" --external-message "I'm currently away"

# Unsubscribe from a mailing list (REQUIRES user confirmation before execution)
bun run scripts/outlook-manage.ts unsubscribe --message-id "AAMk..."
Scan Operations
bash
# Sender digest - scan inbox grouped by sender
bun run scripts/outlook-scan.ts sender-digest [--query "..."] [--time-range "90d"] [--account "..."]

# Outreach scan - identify cold outreach senders
bun run scripts/outlook-scan.ts outreach-scan [--time-range "90d"] [--account "..."]

Scan scripts store message IDs in the daemon's in-memory cache (via assistant cache) and return a lightweight summary with a cache_key. This keeps thousands of message IDs out of the conversation context. To retrieve cached message IDs for a specific sender:

bash
assistant cache get <cache_key> --json
# Returns: { "ok": true, "data": { "sender@example.com": ["msgId1", "msgId2", ...], ... } }

Email Routing Priority

When the user mentions "email" - sending, reading, checking, decluttering, drafting, or anything else - always default to the user's own email (Outlook) unless they explicitly ask about the assistant's own email address (e.g., "set up your email", "send from your address", "check your inbox"). The vast majority of email requests are about the user's Outlook, not the assistant's @vellum.me address.

Do not offer the assistant's own email as an option unless the user specifically asks. If Outlook is not connected, guide them through Outlook setup.

Connection Setup

Outlook
  1. Check connection health first. Run assistant oauth ping outlook. This checks whether the user's Outlook/Microsoft account is connected and the token is valid.
  2. If no connection is found or the ping fails: Load the vellum-oauth-integrations skill. The skill will evaluate whether managed or your-own mode is appropriate and guide the user accordingly.

Error Recovery

When an Outlook script fails with a token or authorization error:

  1. Try to reconnect silently. Run assistant oauth ping outlook. This often resolves expired tokens automatically.
  2. If reconnection fails, go straight to setup. Don't present options, ask which route the user prefers, or explain what went wrong technically. Just tell the user briefly (e.g., "Outlook needs to be reconnected - let me set that up") and immediately load the vellum-oauth-integrations skill. The user came to you to get something done, not to troubleshoot - make it seamless.
  3. Never try alternative approaches. Don't use curl, browser automation, or any workaround. If the scripts can't do it, the reconnection flow is the answer.
  4. Never expose error details. The user doesn't need to see error messages about tokens, OAuth, or API failures. Translate errors into plain language.

Safety: Send-Draft and Unsubscribe

Two operations are high-risk and require explicit user confirmation before execution:

  • send-draft: Always show the user what will be sent (recipients, subject, body summary) and wait for explicit confirmation ("yes", "send it", etc.) before running the send-draft script. Never auto-send.
  • unsubscribe: Always tell the user which mailing list will be unsubscribed from and wait for explicit confirmation before running the unsubscribe script. Unsubscribe actions cannot be undone.

If the user has not explicitly confirmed, do not execute these operations. A general instruction like "clean up my inbox" is not confirmation to unsubscribe - it means scan and present options.

Drafting vs Sending (Outlook)

Outlook uses a draft-first workflow, matching Gmail. Compose and reply land in the user's Outlook Drafts folder. Nothing is sent until they confirm.

  • Prefer messaging_send with platform: "outlook". That creates a real Outlook draft (not a local file). Recipients are optional: if the user has not named a To address, pass a non-email conversation_id (for example drafts) and still create the draft.
  • bun run scripts/outlook-email.ts draft does the same via Graph. --to is optional.
  • Do not inspect this skill's scripts before creating a draft. Call messaging_send or run the draft command immediately.
  • Do not tell the user a draft exists until the tool or script returns success with a draftId. If creation fails or is interrupted, say so and offer the email copy in chat (clipboard or an in-app notification if they ask).
  • The forward operation creates a forward draft, preserving attachments.

To actually send: use bun run scripts/outlook-email.ts send-draft with the draft ID after the user has reviewed it. Only run send-draft when the user explicitly says "send it" or equivalent.

Differences from Gmail

Outlook and Gmail have different organizational models. Keep these distinctions in mind:

ConceptGmailOutlook
OrganizationLabels (multiple per message)Folders (one per message) + Categories (multiple per message)
CategorizationLabels serve dual purposeCategories are color-coded tags independent of folder location
Follow-upLabel-based trackingNative flag system (flagged, complete, notFlagged)
Inbox rulesGmail filtersOutlook inbox rules (server-side)
ArchiveRemove INBOX labelMove to Archive folder
Categories

Categories are Outlook's tagging system for organizing messages. Unlike Gmail labels, categories are independent of folder structure - a message can be in any folder and have multiple categories. Categories are color-coded (Blue, Green, Orange, Purple, Red, Yellow, or custom names). Use categories to tag and organize messages without moving them between folders.

Follow-up Flags

Outlook uses a native flag system for follow-up tracking:

  • flagged - message is marked for follow-up
  • complete - follow-up is done
  • notFlagged - no follow-up tracking

This replaces Gmail's label-based follow-up approach. Use the Outlook flag system directly rather than creating custom folder-based workarounds.

Inbox Rules vs Gmail Filters

Outlook inbox rules run server-side and support conditions like sender, subject, body keywords, and importance level. Actions include moving to folders, categorizing, flagging, forwarding, and deleting. When a user asks to "filter" or "auto-sort" email, use the rules operation - do not try to replicate Gmail's label-based filtering with Outlook folders.

Show full SKILL.md (681 more words)Show less
Folders vs Labels

Gmail uses labels - a message can have multiple labels and removing the INBOX label archives it. Outlook uses folders - a message lives in exactly one folder at a time. Moving a message to Archive removes it from Inbox. To tag a message with multiple categories without moving it, use the categories operation. Do not create folder hierarchies to simulate Gmail's multi-label system.

Email Decluttering

When a user asks to declutter, clean up, or organize their email - start scanning immediately. Don't ask what kind of cleanup they want or request permission to read their inbox. Go straight to scanning - but once results are ready, always present them and let the user choose actions before archiving or unsubscribing.

CRITICAL: Never archive, unsubscribe, or take similar bulk actions unless the user has explicitly confirmed for that specific batch. Each batch of results requires its own explicit user confirmation. If the user says "keep going" or "keep decluttering," that means scan and present new results - NOT auto-archive. Previous batch approvals do not carry forward, but deselections DO carry forward: when the user deselects senders from a cleanup batch, record those as user preferences and exclude them from future cleanup batches.

Workflow
  1. Scan: Run bun run scripts/outlook-scan.ts sender-digest. The script returns a cache_key plus a lightweight sender summary (counts, unsubscribe availability, sample subjects). Message IDs are stored daemon-side — do NOT ask for them unless needed for archiving.
  2. Present: Show results to the user — senders, email counts, and whether unsubscribe is available for each. Pre-select all senders so users deselect what they want to keep.
  3. Wait for user action: Stop and wait. Do NOT proceed to archiving or unsubscribing until the user explicitly confirms which senders to clean up and which action to take ("Archive & Unsubscribe" or "Archive Only").
  4. Act on selection: After confirmation, use messaging_archive_by_sender with from:<email> queries to archive selected senders. For unsubscribe, run the unsubscribe script for senders with hasUnsubscribe: true. If you need specific message IDs (e.g., for targeted operations), retrieve them via assistant cache get <cache_key> --json.
  5. Accurate summary: Report exact counts: "Cleaned up [total_archived] emails from [sender_count] senders. Unsubscribed from [unsub_count]."
  6. Ongoing protection offer: After reporting results, offer inbox rules:
    • "Want me to set up inbox rules so future emails from these senders skip your inbox?"
    • If yes, run the rules script with --action create for each sender.
    • Then offer a recurring declutter schedule.
Edge Cases
  • Zero results: Tell the user "No newsletter emails found" and suggest broadening the query (e.g. extending the date range)
  • Unsubscribe failures: Report per-sender success/failure
  • Truncation handling: If truncated is true (message cap reached or time budget exceeded), the top senders are still captured. Present whatever results were collected - do not retry or continue. Tell the user: "Scanned [N] messages - here are your top senders."

Common Workflows

Declutter Inbox
  1. Run bun run scripts/outlook-scan.ts sender-digest to scan for newsletters and promotions
  2. Present results showing senders, message counts, and unsubscribe availability
  3. Wait for user to select senders and confirm an action
  4. Archive selected senders and unsubscribe where available (if user chose "Archive & Unsubscribe")
  5. Offer to create inbox rules for ongoing protection
Create a Mail Rule
  1. User says "auto-archive emails from newsletters@example.com"
  2. Run bun run scripts/outlook-manage.ts rules --action create --name "..." --conditions '...' --actions '...'
  3. Confirm the rule was created and explain what it does
Set Vacation Auto-Reply
  1. User says "set my out-of-office for next week"
  2. Run bun run scripts/outlook-manage.ts vacation --action enable --internal-message "..." --external-message "..."
  3. Confirm the auto-reply is active and when it expires
Manage Follow-ups
  1. User says "flag this email for follow-up" - run bun run scripts/outlook-manage.ts follow-up --action track --message-id "..."
  2. User says "what emails am I tracking?" - run bun run scripts/outlook-manage.ts follow-up --action list
  3. User says "mark that as done" - run bun run scripts/outlook-manage.ts follow-up --action complete --message-id "..."
Identify Cold Outreach
  1. Run bun run scripts/outlook-scan.ts outreach-scan to find senders without unsubscribe headers
  2. Present results for review - these are likely cold outreach or unsolicited emails
  3. User can choose to archive, create rules to block, or ignore

© vellum-ai, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 6 other files (scripts, assets) in skills/outlook of vellum-ai/vellum-assistant.

  • SKILL.md
  • assets/icon.svg
  • scripts/lib/common.ts
  • scripts/lib/graph-client.ts
  • scripts/outlook-email.ts
  • scripts/outlook-manage.ts
  • scripts/outlook-scan.ts

Open the folder on GitHubat commit 33cc983

Compare with similar skills

Outlook next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Outlook compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Outlook this skillvellum-ai/vellum-assistant1.4k—~3.9kAutomated safety check: WarnMIT
Outlook Nativetaracodlabs/aiden852—~816Automated safety check: PassApache-2.0
Outlooksigcli/sigcli293—~2.6kAutomated safety check: PassMIT
Find Outlook Emailsaiskillstore/marketplace433—~1.6kAutomated safety check: PassMIT-0
Pp Outlook Emailmvanhorn/printing-press-library2.1k—~4.2kAutomated safety check: NotesApache-2.0
Garden Inboxpaperclipai/paperclip100k—~1.1kAutomated safety check: PassMIT

Similar skills

  • Outlook Native

    taracodlabs/aiden

    Outlook calendar + inbox via PowerShell COM or Microsoft Graph

    852 GitHub stars~816 tokensUpdated 27 days ago
    Productivity & AutomationAuto-check passed
  • Outlook

    sigcli/sigcli

    Interact with Outlook email — read inbox, send emails, search messages, reply/forward, manage folders, download attachments.

    293 GitHub stars~2.6k tokensUpdated 13 days ago
    Productivity & AutomationAuto-check passed
  • Find Outlook Emails

    aiskillstore/marketplace

    Search your Microsoft Outlook inbox and cross-reference emails with your contact history — find any email instantly and see full relationship context alongside it via Rarefriend.

    433 GitHub stars~1.6k tokensUpdated yesterday
    Sales & SupportAuto-check passed
  • Pp Outlook Email

    mvanhorn/printing-press-library

    Drive your personal Microsoft 365 inbox from agents — read, send, sync, and run offline triage analytics that...

    2.1k GitHub stars~4.2k tokensUpdated yesterday
    Documents & OfficeAuto-check: notes
  • Garden Inbox

    paperclipai/paperclip

    Scan a Paperclip user's Mine inbox, classify reversible archive candidates, request checkbox confirmation, and archive only accepted selections.

    100k GitHub stars~1.1k tokensUpdated today
    Productivity & AutomationAuto-check passed
  • Continue

    telegramdesktop/tdesktop

    Continue autonomous Telegram Desktop development from the shared ai-tdesktop repository.

    33k GitHub starsUsed in 2 repos~9.4k tokens
    Productivity & AutomationAuto-check passed

More from vellum-ai/vellum-assistant

All 108 skills in this repo
  • Vellum GitHub App Setup

    vellum-ai/vellum-assistant

    Create and configure a GitHub App so the assistant can push commits, open PRs, and comment under its own bot identity.

    1.4k GitHub stars~3.1k tokensUpdated yesterday
    Auto-check passed
  • Discord App Setup

    vellum-ai/vellum-assistant

    Connect a Discord bot to the assistant via the Discord Gateway with guided application creation and intent configuration

    1.4k GitHub stars~4.2k tokensUpdated yesterday
    Auto-check passed
  • Sentry App Setup

    vellum-ai/vellum-assistant

    Create and configure a Sentry internal integration so the assistant can manage issues, alerts, and releases under its own identity

    1.4k GitHub stars~1.3k tokensUpdated yesterday
    Auto-check passed
  • Memory Corpus Ingest

    vellum-ai/vellum-assistant

    Ingest a large dataset into memory as a skimmed map. An agent skill from vellum-ai/vellum-assistant.

    1.4k GitHub stars~3k tokensUpdated yesterday
    Auto-check: notes
  • Plugin Builder

    vellum-ai/vellum-assistant

    A skill your agent uses when the user wants to build, scaffold, ship, or edit a Vellum plugin that bundles multiple surfaces (hooks, tools, skills, and more) into one installable package.

    1.4k GitHub stars~3.1k tokensUpdated yesterday
    Auto-check passed
  • Slack App Setup

    vellum-ai/vellum-assistant

    Connect a Slack app to the Vellum Assistant via Socket Mode.

    1.4k GitHub stars~2.5k tokensUpdated yesterday
    Auto-check: warnings

Questions about Outlook

What does Outlook do?

Manage Outlook email — drafting, sending, organizing, rules, vacation replies, and inbox analysis. Outlook is an agent skill from vellum-ai/vellum-assistant.

When should I use Outlook?

Outlook fits situations like: tasks that involve Email management.

How do I install Outlook in Claude Code?

Run `npx skills add vellum-ai/vellum-assistant --skill outlook -a claude-code`. Or copy the skill folder (skills/outlook in vellum-ai/vellum-assistant) into .claude/skills/outlook in your project. Claude Code loads it when a task matches its description.

How do I install Outlook in Codex?

Run `npx skills add vellum-ai/vellum-assistant --skill outlook -a codex`. Or copy the skill folder (skills/outlook in vellum-ai/vellum-assistant) into .agents/skills/outlook in your project. Codex loads it when a task matches its description.

Can I use Outlook in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add vellum-ai/vellum-assistant --skill outlook -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/outlook, .gemini/skills/outlook, .github/skills/outlook and .opencode/skills/outlook in your project.

What does Outlook need to run?

Going by SKILL.md and its folder, Outlook needs TypeScript for the scripts in its folder and the command-line tools its instructions call (bun). Our summary lists: Node.js. Compatibility (from SKILL.md): Designed for Vellum personal assistants.

Does Outlook access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Outlook safe to install?

Our automated static check of SKILL.md flagged 1 warning(s): contains instruction-override wording (e.g. “without asking the user”). Read the flagged lines before installing; the check is not a guarantee either way. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Outlook use?

Outlook is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Outlook use?

About 3.9k tokens (SKILL.md is roughly 15k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Outlook?

Skills that share tags, products or a category with Outlook: Outlook Native (taracodlabs/aiden, 852 stars), Outlook (sigcli/sigcli, 293 stars), Find Outlook Emails (aiskillstore/marketplace, 433 stars) and Pp Outlook Email (mvanhorn/printing-press-library, 2.1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Outlook?

vellum-ai (a GitHub organization) maintains it in vellum-ai/vellum-assistant, which has 1,408 GitHub stars. The repository holds 108 skills in this directory. The repository was last updated on October 9, 2026.

Source: vellum-ai/vellum-assistant on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.