Huginn is a system of small agents that run on your own server and do things for you online. One agent scrapes a page or reads an RSS feed, an IMAP inbox, a webhook or an MQTT topic; it emits events; other agents filter, combine or transform those events and then act, by sending an email digest, posting to Slack or Telegram, calling a webhook, texting through Twilio or saving a file to S3. Chained together they form a graph you can see in the browser.
It is on this list because it is the long-running, self-hosted answer to IFTTT and Zapier, and your data stays with you. The project dates back to 2013, has more than 260 contributors, and is still released regularly, now with agents for OpenAI-compatible APIs that summarise, classify or translate text. Logic beyond the built-in agents can be written in JavaScript, Liquid templates or jq.
The limits: setting up agents means editing JSON options rather than drawing boxes, so it suits people who do not mind a little configuration. It needs an always-on server with a database, and the maintainer works on it in spare time.
- Repository: github.com/huginn/huginn
- Licence: MIT (MIT License)
- Language: Ruby. Stars: 50.1K. Forks: 4,317. Last push: Oct 24, 2026.
- Scan: safe, Oct 26, 2026, commit af23181
Who it is for
Tinkerers and developers who want automations on their own server, people tracking price drops, page changes or news, and anyone who has outgrown the free tier of a hosted automation service.
Getting started
1. Try it in one Docker container, then open http://localhost:3000
docker run -it -p 3000:3000 ghcr.io/huginn/huginnLog in as admin with the password printed once in the container log. For real use, the README recommends the Docker Compose files in docker/single-process with MySQL or PostgreSQL so your data persists.
Safety scan
We cloned huginn/huginn at commit af23181 on Oct 26, 2026 and ran the checks described on the GitHub Tools page: credential patterns, decode-and-execute code, install-time scripts, committed binaries, risky CI workflows, every host the code talks to, known vulnerabilities in pinned dependencies, and project hygiene. A person read every hit. This is what we found.
- The four private-key hits are not keys. Two are the bare BEGIN PRIVATE KEY header in the Google Calendar agent's instructions, showing where your own key goes, and two are the same placeholder in the README of the vendored dotenv gem.
- The exfil-host hits are the Telegram agent calling api.telegram.org with the bot token you give it, which is how Telegram bots work, plus test stubs with a dummy token and an ngrok URL in a test comment.
- docker/scripts/prepare pipes the NodeSource setup script into bash while building the Docker image. That runs at image build time, not on your machine.
- package-lock.json (97 npm packages) has no known advisories. The Ruby dependencies were not checked by this scan.
- Four workflows, no pull_request_target, and all 25 third-party actions pinned to a commit. Security policy, contributing guide and Renovate present; OpenSSF Scorecard 6.1 of 10.
What the scanner counted
| Check | Result |
|---|---|
| Secrets | 4 candidates found and read; see the notes above. |
| Suspicious code | 7 pattern hits found and read; every one is listed under the raw findings. |
| Install-time code | 1 installer script |
| Committed binaries | None. |
| CI workflows | 4 workflows. None use pull_request_target. 0 of 25 third-party actions pinned to a tag rather than a commit. |
| Network hosts | 40 distinct hosts referenced from source; most often github.com, xkcd.com, api.openai.com, graph.threads.net. No URLs to bare IP addresses. |
| Known vulnerabilities | 0 advisories across 97 pinned packages: 0 critical, 0 high, 0 moderate, 0 low. package-lock.json: 97 packages, 0 advisories. |
| Project hygiene | Has security policy, automated dependency updates, licence file, contributing guide. Missing CodeQL. |
| OpenSSF Scorecard | 6.1 out of 10, as of Oct 19, 2026. |
The raw findings
Every hit the scanner wrote out, with a link to the exact line at the scanned commit. Secrets candidates are redacted.
Secret candidates (4, redacted)
| Where | Rule | Match |
|---|---|---|
| app/models/agents/google_calendar_publish_agent.rb:32 | private-key | -----B…--- (27 chars) |
| app/models/agents/google_calendar_publish_agent.rb:104 | private-key | -----B…--- (27 chars) |
| vendor/gems/dotenv-3.2.0/README.md:195 | private-key | -----B…--- (31 chars) |
| vendor/gems/dotenv-3.2.0/README.md:206 | private-key | -----B…--- (31 chars) |
Pattern hits (7)
| Where | Rule | Match |
|---|---|---|
| app/models/agents/telegram_agent.rb:178 | exfil-host | "https://api.telegram.org/bot#{interpolated['auth_token']}/#{method}" |
| docker/scripts/prepare:46 | download-piped-to-shell | curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - |
| spec/models/agents/telegram_agent_spec.rb:155 | exfil-host (test/example) | stub_request(:post, "https://api.telegram.org/botxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/sendMessage"). |
| spec/models/agents/telegram_agent_spec.rb:177 | exfil-host (test/example) | stub_request(:post, "https://api.telegram.org/botxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/getUpdates"). |
| spec/models/agents/telegram_agent_spec.rb:188 | exfil-host (test/example) | stub_request(:post, "https://api.telegram.org/botxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/getMe"). |
| spec/models/agents/telegram_agent_spec.rb:195 | exfil-host (test/example) | stub_request(:post, "https://api.telegram.org/botxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/getMe"). |
| spec/models/agents/twilio_receive_text_agent_spec.rb:5 | exfil-host (test/example) | # url: https://b924379f.ngrok.io/users/1/web_requests/7/sms-endpoint |
Installer scripts (1)
By the numbers
| Stars | 50.1K |
|---|---|
| Forks | 4,317 |
| Contributors | 269 |
| Commits | 4,301 |
| Open issues | 606 |
| Open pull requests | 82 |
| Releases | 9 |
| Latest release | v2026.10.24 |
| Licence | MIT |
| Main language | Ruby |
| Project age | 13 years |
| Last push | Oct 24, 2026 |
| Tracked files | 880 |
| Lines of code | 63.5K |
| Checkout size | 6 MB |
Lines by language: Ruby 53.1K, JSON 3,786, Markdown 2,554, JavaScript 1,862, YAML 1,498, SCSS 382.
Questions
Is Huginn free?
Yes. Huginn is MIT-licensed and free. Running it costs whatever your server costs; the README notes that managed platforms with an always-on worker usually mean a small monthly bill.
How is Huginn different from n8n?
Both are self-hosted automation tools. n8n is a visual workflow builder with a large library of app integrations. Huginn is event-driven agents configured in JSON, strong at watching websites and feeds over time. n8n is easier to start; Huginn is lighter and fully MIT-licensed.
Can Huginn use AI models?
Yes. Recent releases include agents for OpenAI-compatible APIs that can summarise, classify and translate text or generate images and speech, so you can point them at OpenAI or at a local server.
This post is part of GitHub Tools, where every repository is cloned and scanned before it is written up. The scan is a snapshot of one commit on one day; the repository has moved on since, so check it before you install.
