mono-agent

module
v0.39.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 5, 2026 License: MIT

README ΒΆ

Mono Agent

Local-first n8n alternative in a single Go binary
β€” visual workflows, CLI, human-in-the-loop.

CI Go Version Platform


What is Mono Agent?

Mono Agent is a local-first automation platform for humans and AI agents:

Project status: pre-1.0, single maintainer. Core workflow engine and node set are exercised by CI (go test ./...), but expect breaking changes between minor versions until 1.0.

  • πŸ” DAG workflow engine β€” 90 built-in node types (150 with the optional social build): services (GitHub, Google Sheets / Gmail / Drive, Stripe, Salesforce, HubSpot, Jira, Linear, Notion, Airtable), databases, HTTP, data transforms, and comms (Gmail, Outlook, Slack, Telegram, Discord, and more)
  • πŸ“¦ Single static Go binary β€” zero CGO, SQLite embedded, no Docker, no Node.js runtime, no telemetry. All data stays on your machine (crash reports default to local files β€” see SECURITY.md)
  • πŸ–₯️ Three ways to drive it β€” a visual canvas editor (Wails desktop GUI), a 70+-command CLI with JSON output everywhere, and a built-in MCP server so AI agents can operate it safely
  • 🀝 Human-in-the-loop as a platform primitive β€” pause any workflow for review, edit the payload, then approve or reject; the queue is durable and survives restarts
  • 🌐 Browser automation where no practical API exists β€” drive your own logged-in Chrome via the bundled extension bridge, publishing to and reading your own accounts (same model as consumer RPA tools)
  • πŸ“£ Social platform nodes (Instagram, LinkedIn, X, TikTok, Hacker News, Product Hunt) are an opt-in compile-time build (-tags social) for managing your own accounts β€” see Usage Policy

Think of it as an honest, self-hosted n8n you can carry in a single file β€” with human approval gates and first-class agent access built in.

Scope & fair use

Mono Agent is a general automation tool. The social/browser nodes exist to publish to and read your own accounts, not to mass-message, spam, or manipulate anyone.

  • Own accounts only β€” actions run against sessions and credentials you personally control
  • Approval gates β€” drop a core.human_in_loop node before any sensitive step so a human reviews (and can edit) what goes out
  • Platform terms apply β€” automating your own account may still be subject to the platform's Terms of Service; that's between you and the platform
  • Read the full policy β€” docs/USAGE_POLICY.md

Mono Agent is an independent, unofficial, MIT-licensed project. It is not affiliated with, endorsed by, or connected to any of the platforms it can talk to.


Quick Start

# Build the CLI (Go 1.25+, no CGO)
git clone https://github.com/monoes/mono-agent.git
cd mono-agent
go build -o monoagentcli ./cmd/monoagentcli

# Orientation
./monoagentcli version
./monoagentcli ref                       # built-in offline docs: commands, nodes, expressions
./monoagentcli node list                 # all 90 node types

# Try the flagship example workflow (prints the new workflow id)
./monoagentcli workflow templates list
./monoagentcli workflow import --file examples/morning-briefing.json
./monoagentcli workflow activate <id>              # enable its triggers
./monoagentcli workflow run <id>                   # run it now
# Note: the full flagship run needs an OpenRouter API key (`connect openrouter`) β€” without one it fails cleanly at the summarize step.

# Run the scheduler daemon (keeps cron/webhook triggers alive)
./monoagentcli daemon

Prefer a one-line install? See install.sh or Docker.

Flagship example β€” "Morning Briefing"

Every weekday at 7am: read your favorite feeds, filter for AI news, summarize with an LLM, pause for a human to edit the summary, then email it to you.

[trigger.schedule: 0 0 7 * * 1-5]
        β”‚
        β–Ό
[system.rss_read]        ← fetch items from an RSS/Atom feed
        β”‚
        β–Ό
[core.filter]            ← keep items matching a condition
        β”‚
        β–Ό
[service.openrouter]     ← generate_text: summarize titles into a brief
        β”‚
        β–Ό
[core.human_in_loop]     ← PAUSE β€” you review & edit the draft
        β”‚                   Approve β†’ continue | Reject β†’ drop
        β–Ό
[comm.email_send]        ← email the approved digest to you
{
  "name": "Morning Briefing",
  "nodes": [
    { "id": "t1",  "type": "trigger.schedule",   "config": { "cron": "0 0 7 * * 1-5" } },
    { "id": "n1",  "type": "system.rss_read",    "config": { "url": "https://example.com/feed.xml", "limit": 25 } },
    { "id": "n2",  "type": "core.filter",        "config": { "condition": "{{item.title}} contains ai" } },
    { "id": "n3",  "type": "service.openrouter", "config": {
        "operation": "generate_text", "model": "anthropic/claude-3-haiku",
        "prompt": "Summarize these headlines into a 5-bullet briefing:\n{{item.title}}", "credential_id": "YOUR_OR_CRED" } },
    { "id": "n4",  "type": "core.human_in_loop", "config": {
        "readonly_fields": ["title", "link"],
        "editable_fields": ["summary"],
        "timeout_minutes": 120 } },
    { "id": "n5",  "type": "comm.email_send",    "config": {
        "to": "you@example.com", "subject": "Morning Briefing",
        "body": "{{item.summary}}", "credential_id": "YOUR_SMTP_CRED" } }
  ],
  "connections": [
    { "source": "t1", "target": "n1" }, { "source": "n1", "target": "n2" },
    { "source": "n2", "target": "n3" }, { "source": "n3", "target": "n4" },
    { "source": "n4", "target": "n5" }
  ]
}

More ready-to-run workflows (RSS→AI→email, Sheets→Gmail, Stripe→Sheets sync, GitHub→Linear, and more) live in examples/.


Feature Highlights

πŸ”„ Workflow Engine

  • DAG execution with cycle detection (Kahn topological sort)
  • Template expressions {{variable.path}} β€” dot notation, array indices, fallback chains
  • Per-node on_error semantics: stop, continue, skip, error_branch
  • Honest run statuses β€” partial failures surface as SUCCESS_WITH_ERRORS, never green
  • Webhook, cron, and manual triggers
  • Hybrid storage: JSON workflow files + SQLite; full execution history

🀝 Human-in-the-Loop (platform primitive)

  • Drop core.human_in_loop anywhere to pause for human review
  • Durable, DB-backed queue β€” pending approvals survive restarts
  • Edit-before-approve β€” readonly fields show context; editable fields let the reviewer fix content before it proceeds
  • Optional timeout with auto-reject
  • Approve via CLI (hil list / hil approve <id>) or the GUI review panel

πŸ‘€ Multi-Profile Workspaces

  • Named workspaces (default, work, client-a, …) with full tenant isolation
  • Workflows, connections, people, vault images, HIL items β€” all scoped per workspace
  • Switch with --profile <name> on any CLI command or via the GUI sidebar
  • Running workflows in one workspace are unaffected when you switch to another

πŸ” Encrypted Secrets Vault

  • Secrets stored in your OS keyring (macOS Keychain / Windows Credential Manager / Linux secret service)
  • AES-256-GCM envelope encryption (DEK/KEK) for data at rest
  • Per-profile vault: each workspace gets its own KEK and vault folder; entries re-encrypt on profile moves
  • Encrypted, passphrase-protected portable export (secret export / secret import)
  • One-command migration: secret encrypt-connections seals legacy plaintext credentials in place
  • Manageable from the CLI (secret) or the GUI Vault page

πŸ“‡ CRM: People + Communications

  • Contact database with tags, notes, and full message history
  • Unified inbox across sources (Gmail, Outlook sync built in)
  • AI drafts an email β†’ you edit/approve β†’ one-click send (see example below)
  • people import (JSON), people search, and per-person status timeline

πŸ–ΌοΈ Image Vault

  • Every workflow-generated image registered with provenance (which run, which node)
  • Reference images in prompts and posts as {{@img-001}}
  • Fullscreen editor β€” crop, resize, rotate, filters
  • AI background removal (U2-Net) plus a full image-processing node set
  • Profile-scoped: each workspace sees only its own vault

πŸ“£ Communication Nodes

  • Email: comm.email_send, Outlook (comm.outlook_read / comm.outlook_send)
  • Chat: Slack, Discord, Telegram, WhatsApp, Twilio (SMS)
  • Open social protocols: Bluesky, Mastodon, Reddit β€” via official-style APIs
  • comm.email_read is currently experimental (requires an IMAP dependency not yet vendored)

πŸ€– AI Canvas Chat + Desktop GUI

  • Conversational workflow builder: describe the workflow in chat, AI wires the nodes
  • Built-in assistant (monoagentcli chat) with named sessions and explicit opt-in tools (--tools monoagent[,runs]) β€” tool access is off by default
  • OpenRouter (200+ models), HuggingFace, Gemini
  • Wails 2 desktop app: canvas editor, HIL review panel, Vault, People, Image Vault
  • Dark-themed, keyboard-navigable, fully local

🀝 Human-in-the-Loop example: email outreach with review

The pattern Mono Agent recommends for any outbound communication β€” the AI drafts, a human decides. No message leaves the machine until a person approves it.

[service.google_sheets]      ← read prospect rows (name, company, email)
        β”‚
        β–Ό
[service.openrouter]         ← generate_text: draft a personalized email
        β”‚
        β–Ό
[core.human_in_loop]         ← PAUSE β€” reviewer sees:
        β”‚                       Read-only: name, company, email
        β”‚                       Editable:  subject, body
        β”‚                     Approve β†’ continue | Reject β†’ drop item
        β–Ό
[comm.email_send]            ← send the approved (possibly edited) email
        β”‚
        β–Ό
[service.google_sheets]      ← mark row as "sent"
{
  "id": "n3",
  "type": "core.human_in_loop",
  "config": {
    "readonly_fields": ["name", "company", "email"],
    "editable_fields": ["subject", "body"],
    "timeout_minutes": 60
  }
}

Approve from the terminal while the workflow waits:

monoagentcli hil list               # show pending items
monoagentcli hil approve <id>       # resume the workflow
monoagentcli hil reject <id>        # drop the item

Node Library

90 built-in node types (+ triggers) in the default build β€” 150 with the optional social build (below).

βš™οΈ Core Control (15 nodes)
Node Description
core.if Conditional branching β€” route items by expression
core.switch Multi-way routing β€” N output handles
core.set Assign or transform fields on items
core.filter Keep only items matching a predicate
core.code Execute JavaScript (Goja engine) on item stream
core.merge Combine multiple input streams
core.split_in_batches Chunk items into N-size groups
core.wait Pause execution for N seconds
core.limit Keep first N items
core.sort Sort items by key ascending/descending
core.remove_duplicates Deduplicate items by key
core.compare_datasets Diff two item streams
core.aggregate Sum, avg, count, min, max over a field
core.stop_error Halt workflow with a custom error message
core.human_in_loop Pause execution β€” human reviews, edits, approves or rejects
πŸ”— Services (24 nodes)
Node Description
service.google_sheets Read rows, append, update, clear ranges
service.gmail Send and read Gmail messages
service.google_drive File operations on Google Drive
service.outlook_mail Read/send Outlook via Microsoft Graph
service.openrouter Generate text or images via 200+ AI models
service.huggingface HuggingFace inference (text + images)
service.github Issues, PRs, repos, and more
service.notion Pages, databases, blocks
service.airtable Records, bases, fields
service.linear Issues, projects, teams
service.jira Issues, sprints, projects
service.asana Tasks, projects, teams
service.stripe Payments, customers, subscriptions
service.shopify Products, orders, customers
service.salesforce CRM objects and records
service.hubspot Contacts, deals, companies
service.youtube Video and channel data
service.bluesky ATProto β€” posts and profile data
service.mastodon ActivityPub β€” toots and timelines
service.reddit Posts, comments, subreddits
service.devto / service.hashnode / service.producthunt / service.discord Dev community platforms
πŸ—„οΈ Database (4 nodes)

db.postgres Β· db.mysql Β· db.mongodb Β· db.redis

🌐 HTTP & Network (3 nodes)

http.request Β· http.ftp Β· http.ssh

πŸ”§ Data Transformation (8 nodes)

data.datetime Β· data.crypto Β· data.html Β· data.xml Β· data.markdown Β· data.spreadsheet Β· data.compression Β· data.write_binary_file

πŸ–ΌοΈ Image Processing (7 nodes)

image.info Β· image.resize Β· image.crop Β· image.thumbnail Β· image.convert Β· image.adjust Β· image.remove_background (U2-Net AI)

πŸ“£ Communication (12 nodes)

comm.email_send Β· comm.email_read (experimental) Β· comm.outlook_read Β· comm.outlook_send Β· comm.slack Β· comm.discord Β· comm.telegram Β· comm.twilio Β· comm.whatsapp Β· comm.bluesky Β· comm.mastodon Β· comm.reddit

🧠 AI, Gemini, System & People (17 nodes)
Node Description
ai.read_page / ai.extract_page AI-assisted page reading and structured extraction
agent.ask Ask an agent runtime a question mid-workflow
system.execute_command Run a local shell command, capture output
system.rss_read Fetch items from RSS / Atom feeds
people.save Upsert a contact into the CRM (profile-scoped)
people.sync_outlook_message Sync an Outlook message into People history

Also: ai.agent Β· ai.chat Β· ai.classify Β· ai.embed Β· ai.extract Β· ai.transform (LLM utilities), and gemini.chat_session Β· gemini.chat_session_many Β· gemini.generate_image Β· gemini.generate_text (Gemini via your own logged-in browser session β€” no API key).

⏰ Triggers (3 types)
Trigger Description
trigger.schedule Cron expression (6 fields: sec min hour dom month dow) β€” 0 0 9 * * * every day at 9am
trigger.webhook HTTP endpoint β€” fire workflow on POST
trigger.manual One-click run from CLI or GUI
πŸ“± Social platform actions β€” opt-in build (-tags social)

Publish to and read your own accounts on these platforms via the Chrome extension bridge. These node types are not compiled into the default binary β€” build with go build -tags social ./cmd/monoagentcli to include them. They exist for managing your own presence; platform terms apply β€” see the Usage Policy.

Platform Available actions
Instagram publish_post Β· like_posts Β· comment_on_posts Β· reply_to_comments Β· like_comments_on_posts Β· send_dms Β· auto_reply_dms Β· follow_users Β· unfollow_users Β· engage_with_posts Β· engage_user_posts Β· find_by_keyword Β· watch_stories Β· export_followers Β· scrape_profile_info Β· extract_post_data Β· list_user_posts Β· list_post_comments
LinkedIn publish_post Β· like_posts Β· like_comments Β· comment_on_posts Β· send_dms Β· auto_reply_dms Β· engage_with_posts Β· find_by_keyword Β· export_followers Β· scrape_profile_info Β· list_user_posts Β· list_post_comments
X (Twitter) publish_post Β· engage_with_posts Β· send_dms Β· auto_reply_dms Β· find_by_keyword Β· export_followers Β· scrape_profile_info
TikTok publish_post Β· like_video Β· comment_on_video Β· like_comment Β· follow_user Β· engage_with_posts Β· find_by_keyword Β· send_dms Β· auto_reply_dms Β· duet_video Β· stitch_video Β· share_video Β· export_followers Β· scrape_profile_info Β· list_user_videos Β· list_video_comments
Hacker News get_post_metrics Β· list_comments Β· reply_to_comment Β· submit_post
Product Hunt comment_on_launch Β· get_launch_metrics Β· list_comments

CLI Reference

The binary is monoagentcli. Most commands accept --json for machine-readable output and --profile <name> to scope to a workspace.

Workflow

⚠️ workflow import runs a JSON file as a program, not as data. Nodes like core.code (arbitrary JS), system.execute_command (shell), http.ssh, and the db.* nodes execute with your OS user's privileges. Treat a workflow file from anyone else the way you'd treat an unreviewed shell script β€” read it (or workflow validate/get --json it) before importing.

monoagentcli workflow list                          # list workflows (--json)
monoagentcli workflow get <id>                      # print a workflow as JSON
monoagentcli workflow create <name>                 # new blank workflow
monoagentcli workflow import --file flow.json       # import (also accepts stdin)
monoagentcli workflow export <id>                   # export as JSON
monoagentcli workflow validate <id>                 # validate against node schemas (exit 3 on invalid)
monoagentcli workflow run <id>                      # run and wait
monoagentcli workflow run <id> --dry-run            # validate + print execution plan, no run
monoagentcli workflow run <id> --no-wait            # print execution id, exit immediately
monoagentcli workflow run <id> --json               # execution record + per-node outputs
monoagentcli workflow run <id> --input '{"key":1}'  # inject trigger data
monoagentcli workflow activate <id>                 # enable triggers
monoagentcli workflow deactivate <id>               # disable triggers
monoagentcli workflow executions <id>               # run history
monoagentcli workflow search [query]                # search workflows & templates
monoagentcli workflow templates list                # bundled ready-to-use templates
monoagentcli workflow node add <id> --type core.filter --name Filter
monoagentcli workflow node set <id> <node-id> --config '{"max":5}'
monoagentcli workflow node remove <id> <node-id>
monoagentcli workflow connect <id> --from n1:main --to n2:main
Nodes
monoagentcli node list                              # all node types (--json)
monoagentcli node schema core.if                    # JSON schema for a node type
monoagentcli node run http.request \
  --config '{"method":"GET","url":"https://httpbin.org/get"}'
Secrets & Connections
monoagentcli secret add --kind secret --name aws \
  --field access_key_id=... --field secret_access_key=...   # values via flags or stdin
monoagentcli secret list                            # metadata only β€” never values
monoagentcli secret get <name>                      # resolve a vault reference (no plaintext)
monoagentcli secret update <name> / secret rm <name>
monoagentcli secret export                          # encrypted, passphrase-protected bundle
monoagentcli secret import <file>                   # restore on another machine
monoagentcli secret encrypt-connections             # one-time seal of legacy plaintext creds

monoagentcli login <platform>                       # browser session login (saved locally)
monoagentcli login status
monoagentcli connect <platform>                     # add an API credential
monoagentcli connect list / connect test <id> / connect remove <id>
Human-in-the-Loop
monoagentcli hil list                               # pending review items
monoagentcli hil approve <id>                       # resume the workflow
monoagentcli hil reject <id>                        # drop the item (workflow errors out)
People (CRM)
monoagentcli people list                            # contacts (--json)
monoagentcli people import --file people.json --platform linkedin   # JSON array format
monoagentcli people messages list <person-id>       # message history
monoagentcli people messages compose <person-id>    # AI-assisted draft
monoagentcli people messages send-draft <message-id>   # send an approved draft
monoagentcli people status set <person-id> "text"   # status timeline
For AI agents
monoagentcli mcp                  # MCP server over stdio β€” tools/list, workflow_run, hil_approve, …
monoagentcli ref                  # built-in offline docs: commands, nodes, expressions, examples
monoagentcli ref node core.if     # detailed docs for one node type

Full agent documentation: AGENTS.md.

Exit codes
Code Meaning
0 Success
0 Run paused at a human-in-the-loop node β€” status WAITING (paused for human review); the output carries a hint field pointing at hil list
1 General error (including a run that ends CANCELLED)
2 Not found β€” e.g. hil approve/hil reject, secret rm/secret update, or workflow delete on an unknown id
3 Invalid input / validation failure
4 Auth or connection failure
Scheduling
monoagentcli schedule add <action-id> --cron "0 0 9 * * *"
monoagentcli schedule list
monoagentcli daemon                # keep all workflow triggers alive; blocks until Ctrl+C

Workflow triggers (trigger.schedule, trigger.webhook) only fire while a process is serving them β€” run monoagentcli daemon as a persistent background process and activated workflows fire on time, across all profiles.


Chrome Extension

chrome-extension/ lets workflow nodes drive your real, already-logged-in Chrome browser β€” the same model as consumer RPA tools. No separate automation profile, no re-authenticating for sites (like Google) that invalidate sessions ported into a scripted browser.

  • Loopback by default β€” the bridge server binds loopback, and the extension refuses non-loopback servers. A per-session "Allow non-loopback server (unsafe)" checkbox in the popup overrides this for one save; it is never persisted
  • Paired channel β€” the bridge requires a shared secret (~/.monoagent/extension.token) as the first frame on every connection; run monoagentcli extension pair and paste the printed token into the extension popup once. An unpaired connection is rejected and can never replace an already-paired one. Run monoagentcli extension reset to revoke and re-pair
  • Per-site host permissions β€” the extension requests site access on demand (via the popup's "Authorize a site" field) rather than holding <all_urls> by default; grant only the sites your workflows actually target, and revoke from the same popup
  • Shared connection β€” multiple CLI processes share one extension connection instead of fighting over the browser

See docs/security/threat-model.md for the full trust-boundary breakdown.

Install (unpacked, not on the Web Store):

  1. Open chrome://extensions
  2. Enable Developer mode (top-right toggle)
  3. Click Load unpacked and select the chrome-extension/ folder (or the zip from the latest release)

No configuration needed. Run any browser node and look for Chrome extension connected -- using your browser in the output. After pulling changes that touch chrome-extension/, reload it from chrome://extensions.


Getting Started

Prerequisites

  • Go 1.25+ (brew install go)
  • Chrome/Chromium (for browser nodes β€” optional for everything else)
  • That's it β€” SQLite is embedded, no external database

Install

git clone https://github.com/monoes/mono-agent.git
cd mono-agent
go build -o monoagentcli ./cmd/monoagentcli

# Or with the social platform nodes (opt-in):
go build -tags social -o monoagentcli ./cmd/monoagentcli

Windows: download monoagentcli-windows-amd64.exe from releases.

Desktop GUI

cd wails-app
go install github.com/wailsapp/wails/v2/cmd/wails@latest
wails dev      # development mode
wails build    # production build

Profile folders (per-profile vault and data) and the assistant-tools toggle are managed in the GUI's Settings.

Docker

docker compose up -d --build   # daemon + persistent /data volume

# Webhook triggers: the server binds 127.0.0.1:9321 by default β€”
# set the bind address so the published port is reachable:
MONOAGENT_WEBHOOK_ADDR=0.0.0.0:9321 docker compose up -d --build

Browser-based webhook callers additionally need MONOAGENT_WEBHOOK_ALLOWED_ORIGINS (a comma-separated CORS allowlist; unset by default β€” no CORS headers are sent). See docker-compose.yml and the env-var table in AGENTS.md.

Uninstall & data

All state lives under ~/.monoagent/ (workflows, the SQLite DB, per-profile credential vaults, browser sessions, and crash reports) and, on macOS/Linux, in your OS keychain (Keychain Access / Secret Service) for any secrets stored there instead of the vault. To remove Mono Agent completely:

rm /usr/local/bin/monoagentcli        # or wherever you installed it
rm -rf ~/.monoagent                   # workflows, vault, sessions, crash reports

Then remove the Chrome extension from chrome://extensions, and delete the monoagent-vault entry from Keychain Access / Secret Service / Windows Credential Manager manually β€” that's where the vault's OS-keychain-backed encryption key lives, and the CLI never deletes it on uninstall since there's no install hook to run it from.

Personal data: everything Mono Agent stores (contacts, message history, exported followers, connection credentials) stays in ~/.monoagent/ on your machine β€” nothing is sent to us, and there's no telemetry to opt out of. If you use the people / social nodes to import or export data about other people, you're the one responsible for having a lawful basis to hold it (GDPR, CCPA, or your local equivalent) β€” deleting the profile above purges it entirely, but nothing is deleted automatically or on a schedule.


Architecture

mono-agent/
β”œβ”€β”€ cmd/monoagentcli/        # CLI entry point (Cobra)
β”‚   β”œβ”€β”€ workflow.go          # workflow subcommands + engine builder
β”‚   β”œβ”€β”€ node.go              # node run + registry
β”‚   β”œβ”€β”€ ref.go               # built-in offline reference docs
β”‚   β”œβ”€β”€ secret.go            # encrypted secrets vault CLI
β”‚   β”œβ”€β”€ hil.go               # human-in-the-loop approve/reject
β”‚   β”œβ”€β”€ mcp.go               # MCP server for AI agents (stdio)
β”‚   └── ...
β”‚
β”œβ”€β”€ internal/
β”‚   β”œβ”€β”€ workflow/            # Core workflow engine
β”‚   β”‚   β”œβ”€β”€ engine.go        # orchestration + profile isolation
β”‚   β”‚   β”œβ”€β”€ dag.go           # Kahn topological sort, cycle detection
β”‚   β”‚   β”œβ”€β”€ execution.go     # run state machine, on_error β†’ SUCCESS_WITH_ERRORS
β”‚   β”‚   β”œβ”€β”€ expression.go    # {{template}} evaluation
β”‚   β”‚   β”œβ”€β”€ trigger_manager.go  # cron / webhook trigger lifecycle
β”‚   β”‚   β”œβ”€β”€ webhook_server.go   # loopback webhook HTTP server
β”‚   β”‚   β”œβ”€β”€ templates/       # bundled ready-to-use workflows
β”‚   β”‚   └── schemas/         # 90+ embedded JSON node schemas
β”‚   β”‚
β”‚   β”œβ”€β”€ nodes/               # Node executors
β”‚   β”‚   β”œβ”€β”€ control/         # if, filter, set, code, human_in_loop…
β”‚   β”‚   β”œβ”€β”€ service/         # google_sheets, openrouter, github, stripe…
β”‚   β”‚   β”œβ”€β”€ comm/            # email, slack, telegram, outlook, discord…
β”‚   β”‚   β”œβ”€β”€ db/ Β· http/ Β· data/ Β· image/ Β· system/ Β· people/ Β· ai/
β”‚   β”‚   └── browser_adapter.go   # action.* nodes β†’ opt-in social build
β”‚   β”‚
β”‚   β”œβ”€β”€ mcp/                 # JSON-RPC 2.0 MCP server (no dependencies)
β”‚   β”œβ”€β”€ secrets/             # keyring + AES-256-GCM envelope encryption
β”‚   β”œβ”€β”€ vault/               # Image Vault β€” register/resolve/provenance
β”‚   β”œβ”€β”€ connections/         # unified credential storage + OAuth flows
β”‚   β”œβ”€β”€ bot/                 # platform browser adapters (build tag: social)
β”‚   β”œβ”€β”€ extension/           # Chrome extension bridge server (loopback :9222)
β”‚   β”œβ”€β”€ ai/chat/             # AI Canvas Chat β€” conversational builder
β”‚   └── scheduler/ Β· config/ Β· storage/
β”‚
β”œβ”€β”€ wails-app/               # Desktop GUI (Wails 2 + React)
β”œβ”€β”€ examples/                # ready-to-run workflow JSONs
β”œβ”€β”€ docs/                    # usage policy, comparison, screenshots
└── data/actions/            # embedded action definitions

Docs & Resources

Resource What's inside
AGENTS.md Canonical entrypoint for AI agents: ref, --json, MCP, exit codes
docs/USAGE_POLICY.md Scope of use, platform ToS, rate caps, anti-spam commitments
docs/COMPARISON.md Honest comparison vs n8n, Activepieces, Windmill, Node-RED
docs/planning/FEATURE_n8n.md detailed n8n feature map used as our porting reference
examples/ Ready-to-run workflow JSONs with webhook trigger examples
install.sh One-line installer (macOS / Linux)
SECURITY.md Reporting, supported versions, telemetry & crash-reporting statement
CONTRIBUTING.md Build/test commands (incl. -tags social), PR guidelines
CHANGELOG.md Release history
docs/screenshots/ GUI screenshots

Tech Stack

Layer Technology
Language Go 1.25 (zero CGO)
Database modernc.org/sqlite β€” pure Go, embedded
CLI spf13/cobra
Logging rs/zerolog
Scheduling robfig/cron
JS Engine dop251/goja β€” for core.code
Browser go-rod/rod β€” Chrome DevTools Protocol
Keyring zalando/go-keyring β€” OS secret storage
Desktop GUI Wails v2 + React
AI APIs OpenRouter Β· HuggingFace Β· Google Gemini

Roadmap

Recently shipped

  • Multi-profile workspaces β€” all user data scoped per named profile
  • Human-in-Loop node (core.human_in_loop) β€” durable, editable, timeout-aware
  • Image Vault β€” storage, labeling, fullscreen editor, provenance
  • AI Canvas Chat β€” conversational workflow builder
  • Outlook integration β€” read and send email via Microsoft Graph
  • Encrypted Secrets Vault β€” OS keyring + AES-256-GCM + portable encrypted export
  • MCP server β€” AI agents can list, run, and validate workflows
  • Bluesky/Mastodon publishing nodes (comm.bluesky, comm.mastodon) β€” official APIs (ATProto/ActivityPub)

Coming next

  • More trigger types β€” email, file watcher, database change
  • Workflow versioning and rollback
  • Sub-workflow / reusable workflow node
  • Visual debugger β€” step-through execution in GUI
  • Marketplace β€” shareable workflow templates (curation policy written; distribution plumbing not yet built)
  • MCP registry listing + agent tool marketplace
  • Metrics dashboard β€” success rates, throughput, latency per profile

Community

Questions, ideas, and "is this the right tool for X" go to GitHub Discussions β€” the issue tracker is kept for bugs and well-scoped feature requests. See SUPPORT.md for the full breakdown, and SECURITY.md for reporting vulnerabilities (never in a public issue or Discussion).

Contributing

Pull requests are welcome β€” see CONTRIBUTING.md. By participating, you agree to keep Mono Agent a fair-use tool.

go test ./...                  # unit tests (no Chrome needed)
go test -tags "integration,social" ./... # integration tests (requires Chrome)
go vet ./...                   # lint

License

Mono Agent is released under the MIT License. In plain English:

  • βœ… You may use it, commercially or personally
  • βœ… You may modify it and build your own tools on it
  • βœ… You may distribute copies and modified versions
  • ❌ It comes with no warranty β€” the authors are not liable for anything it does or fails to do
  • πŸ“‹ Keep the license and copyright notice with any copy you distribute

Mono Agent is in no way affiliated with Instagram, LinkedIn, X, TikTok, or any platform.
Independent, unofficial, MIT-licensed. Use at your own risk and in accordance with each platform's terms.

Made with β˜• by nokhodian

Directories ΒΆ

Path Synopsis
cmd
debug_registry command
inspect command
monoagentcli command
cmd/monoagentcli/application.go
cmd/monoagentcli/application.go
schemagen command
Command schemagen regenerates internal/workflow/schemas/<node-type>.json for every node type listed in internal/tools/schemagen.Manifest, from the `schema:"..."` struct tags on that node's companion schema struct.
Command schemagen regenerates internal/workflow/schemas/<node-type>.json for every node type listed in internal/tools/schemagen.Manifest, from the `schema:"..."` struct tags on that node's companion schema struct.
internal
ai
applications
Package applications tracks job and tender applications under one shared pipeline: a closed 4-stage status lifecycle, free-form tags, and an append-only audit trail, with kind-specific fields held in typed detail tables rather than a JSON blob.
Package applications tracks job and tender applications under one shared pipeline: a closed 4-stage status lifecycle, free-form tags, and an append-only audit trail, with kind-specific fields held in typed detail tables rather than a JSON blob.
apply
Package apply assembles everything needed to complete one job application by hand (generated documents + the posting open in a browser) β€” see docs/mastermind/specs/2026-09-05-apply-automation-design.md for why this phase deliberately does not auto-fill or auto-submit anything.
Package apply assembles everything needed to complete one job application by hand (generated documents + the posting open in a browser) β€” see docs/mastermind/specs/2026-09-05-apply-automation-design.md for why this phase deliberately does not auto-fill or auto-submit anything.
attachments
Package attachments stores files that arrive with synced messages (email attachments today) on disk, so anything that can read a file β€” an AI agent, a script, the user β€” can open them by path.
Package attachments stores files that arrive with synced messages (email attachments today) on disk, so anything that can read a file β€” an AI agent, a script, the user β€” can open them by path.
bot
bot/hackernews
Package hackernews implements the Hacker News engagement bot.
Package hackernews implements the Hacker News engagement bot.
bot/instagram
Package instagram implements the instagram engagement bot.
Package instagram implements the instagram engagement bot.
bot/linkedin
Package linkedin implements the linkedin engagement bot.
Package linkedin implements the linkedin engagement bot.
bot/producthunt
Package producthunt implements the Product Hunt engagement bot.
Package producthunt implements the Product Hunt engagement bot.
bot/tiktok
Package tiktok implements the tiktok engagement bot.
Package tiktok implements the tiktok engagement bot.
bot/x
Package x implements the X (Twitter) engagement bot.
Package x implements the X (Twitter) engagement bot.
browser
Package browser provides abstractions over browser page and element interactions.
Package browser provides abstractions over browser page and element interactions.
chromecookies
Package chromecookies holds the on-disk shape of a Chrome session cookie as stored in crawler_sessions.cookies_json.
Package chromecookies holds the on-disk shape of a Chrome session cookie as stored in crawler_sessions.cookies_json.
config
internal/config/agentgen.go β€” LLM-backed config generation delegated to a locally-installed AI agent runtime via monomind (Agent Exec Protocol), replacing the former remote API generator (apiv1.monoes.me).
internal/config/agentgen.go β€” LLM-backed config generation delegated to a locally-installed AI agent runtime via monomind (Agent Exec Protocol), replacing the former remote API generator (apiv1.monoes.me).
discovery
internal/discovery/dedup.go
internal/discovery/dedup.go
discovery/sources/arbeitnow
Package arbeitnow implements discovery.Source against Arbeitnow's free, public, unauthenticated job-board API (https://www.arbeitnow.com/api/ job-board-api) β€” verified live and checked against robots.txt (a plain "Disallow:" under "User-agent: *", i.e.
Package arbeitnow implements discovery.Source against Arbeitnow's free, public, unauthenticated job-board API (https://www.arbeitnow.com/api/ job-board-api) β€” verified live and checked against robots.txt (a plain "Disallow:" under "User-agent: *", i.e.
discovery/sources/jobicy
Package jobicy implements discovery.Source against Jobicy's free, public, unauthenticated remote-jobs API (https://jobicy.com/api/v2/remote-jobs) β€” verified live and checked against robots.txt, which explicitly welcomes AI crawlers ("Content-Signal: ai-train=yes, search=yes, ai-input=yes") and does not disallow the API path.
Package jobicy implements discovery.Source against Jobicy's free, public, unauthenticated remote-jobs API (https://jobicy.com/api/v2/remote-jobs) β€” verified live and checked against robots.txt, which explicitly welcomes AI crawlers ("Content-Signal: ai-train=yes, search=yes, ai-input=yes") and does not disallow the API path.
discovery/sources/linkedin
Package linkedin implements discovery.Source against LinkedIn's public unauthenticated "guest" job-search endpoint β€” no login required.
Package linkedin implements discovery.Source against LinkedIn's public unauthenticated "guest" job-search endpoint β€” no login required.
discoveryregistry
Package discoveryregistry is the single place that knows about every concrete discovery.Source implementation, mirroring internal/noderegistry's relationship to internal/workflow β€” kept separate from internal/discovery itself so internal/discovery/sources/* can import internal/discovery (for its types) without creating an import cycle back through a registry living inside internal/discovery.
Package discoveryregistry is the single place that knows about every concrete discovery.Source implementation, mirroring internal/noderegistry's relationship to internal/workflow β€” kept separate from internal/discovery itself so internal/discovery/sources/* can import internal/discovery (for its types) without creating an import cycle back through a registry living inside internal/discovery.
documents
Package documents renders structured CV/cover-letter/tender-proposal data into HTML (via html/template's auto-escaping) and, via pdf.go, PDF.
Package documents renders structured CV/cover-letter/tender-proposal data into HTML (via html/template's auto-escaping) and, via pdf.go, PDF.
extension
Package extension implements a WebSocket-based communication layer between the Go monoagentcli-agent and a Chrome Extension.
Package extension implements a WebSocket-based communication layer between the Go monoagentcli-agent and a Chrome Extension.
httpapi
Package httpapi implements a read-first REST/JSON surface over the workflow engine and vault, for external agents that cannot speak the stdio MCP protocol.
Package httpapi implements a read-first REST/JSON surface over the workflow engine and vault, for external agents that cannot speak the stdio MCP protocol.
i18n
Package i18n is a minimal, dependency-free translation lookup for the CLI.
Package i18n is a minimal, dependency-free translation lookup for the CLI.
matching
internal/matching/evaluate.go
internal/matching/evaluate.go
mcp
Package mcp implements a stdio MCP (Model Context Protocol) server for AI agents: newline-delimited JSON-RPC 2.0 over os.Stdin/os.Stdout, with all logging on stderr so stdout stays a clean protocol channel.
Package mcp implements a stdio MCP (Model Context Protocol) server for AI agents: newline-delimited JSON-RPC 2.0 over os.Stdin/os.Stdout, with all logging on stderr so stdout stays a clean protocol channel.
monomind
Package monomind is the mono-agent client for monomind's Agent Exec Protocol (doc/agent-exec-protocol.md in the monomind repo, v1/rev 4): the subprocess contract monoagentcli uses to delegate every AI interaction to a locally-installed monomind, which in turn drives the installed agent CLIs.
Package monomind is the mono-agent client for monomind's Agent Exec Protocol (doc/agent-exec-protocol.md in the monomind repo, v1/rev 4): the subprocess contract monoagentcli uses to delegate every AI interaction to a locally-installed monomind, which in turn drives the installed agent CLIs.
noderegistry
Package noderegistry builds the canonical workflow node-type registry shared by the CLI and the desktop app, so the set of available nodes has a single source of truth.
Package noderegistry builds the canonical workflow node-type registry shared by the CLI and the desktop app, so the set of available nodes has a single source of truth.
nodes/agent
Package agent provides workflow nodes backed by locally-installed AI agent runtimes, delegated through monomind's Agent Exec Protocol.
Package agent provides workflow nodes backed by locally-installed AI agent runtimes, delegated through monomind's Agent Exec Protocol.
nodes/applications
Package applicationsnodes exposes internal/applications as workflow node types: applications.create, applications.set_status, applications.tag, applications.list.
Package applicationsnodes exposes internal/applications as workflow node types: applications.create, applications.set_status, applications.tag, applications.list.
nodes/apply
Package applynodes exposes internal/apply as a workflow node type: applications.prepare.
Package applynodes exposes internal/apply as a workflow node type: applications.prepare.
nodes/discovery
Package discoverynodes exposes internal/discovery as a workflow node type: discovery.search_jobs.
Package discoverynodes exposes internal/discovery as a workflow node type: discovery.search_jobs.
nodes/documents
Package documentsnodes exposes internal/documents as a workflow node type: documents.render.
Package documentsnodes exposes internal/documents as a workflow node type: documents.render.
nodes/matching
Package matchingnodes exposes internal/matching as a workflow node type: applications.evaluate.
Package matchingnodes exposes internal/matching as a workflow node type: applications.evaluate.
nodes/org
Package org provides a workflow node that runs a monomind agent organization as one step in an automation and waits for it to finish.
Package org provides a workflow node that runs a monomind agent organization as one step in an automation and waits for it to finish.
orgdesign
Package orgdesign reads, mutates, and validates monomind Org Runtime v2 config files (<profile>/.monomind/orgs/<name>.json) directly β€” there is no `monomind org` subcommand for editing an existing org's roles or hierarchy (only a template-scaffolding `create`), so this package is the only mutation path available to the app's org designer canvas and to the AI chat tool surface.
Package orgdesign reads, mutates, and validates monomind Org Runtime v2 config files (<profile>/.monomind/orgs/<name>.json) directly β€” there is no `monomind org` subcommand for editing an existing org's roles or hierarchy (only a template-scaffolding `create`), so this package is the only mutation path available to the app's org designer canvas and to the AI chat tool surface.
profiledir
Package profiledir resolves the per-profile filesystem root each profile's vault files, encrypted keys, and monomind project (knowledge graph + memory) live under.
Package profiledir resolves the per-profile filesystem root each profile's vault files, encrypted keys, and monomind project (knowledge graph + memory) live under.
tools/schemagen
Package schemagen generates internal/workflow/schemas/<node-type>.json files from `schema:"..."` struct tags on Go structs, instead of hand writing that JSON.
Package schemagen generates internal/workflow/schemas/<node-type>.json files from `schema:"..."` struct tags on Go structs, instead of hand writing that JSON.
vault
internal/vault/documents.go
internal/vault/documents.go

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL