
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
@ob1-sg/horizon
Advanced tools
Horizon turns Linear tickets into pull requests with code changes. You write tickets, Horizon runs a loop of researching, planning, implementing, and validating changes on its own. Multiple Horizon agents can work in parallel so you can focus on reviewing high-quality PRs. The validation pipeline ensures the pull requests are tested, easy to review, and ready to merge.
npm install -g @ob1-sg/horizon
npm install --save-dev @ob1-sg/horizon
Install Horizon (see above)
Run Horizon in your project:
cd your-project-with-git-initialized
horizon # Global install
npx horizon # Local install
First-run wizard — Horizon walks you through setup:
auto (recommended), merge, or pr.horizon/ config directory∞ workflow statuses in your Linear teamCreate tickets in Linear and Horizon works on them autonomously
Run horizon config to change settings like provider, model, and iteration limits.
Agent 1 (Linear Reader): Scans Linear for available tickets, prioritizes by urgency, claims the highest-priority ticket, and gathers context.
Agent 2 (Worker): The developer. Reads code, writes code, runs tests, and commits changes.
Agent 3 (Linear Writer): Updates Linear with results - posts comments, updates status, and links commits.
+-----------------------------------------------------------------------+
| Instance (yellow-giraffe) |
+-----------------------------------------------------------------------+
| |
| Loop 1: Ticket PROJ-12 |
| +------------+ +------------+ +------------+ |
| | Agent 1 | | Agent 2 | | Agent 3 | |
| | Linear |---->| Worker |---->| Linear | |
| | Reader | | | | Writer | |
| +------------+ +------------+ +------------+ |
| |
| Loop 2: Ticket PROJ-13 |
| +------------+ +------------+ +------------+ |
| | Agent 1 |---->| Agent 2 |---->| Agent 3 | |
| +------------+ +------------+ +------------+ |
| |
| Loop 3: ... |
| |
+-----------------------------------------------------------------------+
Backlog (default) (or any Needs ... status)∞ DoneBacklog (or any Needs ... status)Run horizon in a separate terminal window for each parallel agent. Agents coordinate through Linear: when one agent claims a ticket, it changes the status to "In Progress" so other agents skip it. Agent 1 (the orchestrator) understands ticket hierarchy and dependencies, so it picks the right work in the right order. Each instance runs loops continuously until there's no more work.
Each Agent 2 (Worker) runs in its own git worktree, so multiple agents can work on different tickets in parallel without conflicts. When a ticket is claimed:
.horizon/worktrees/{issue-identifier}/horizon/{issue-identifier}This means you can run multiple horizon instances simultaneously — each one gets an isolated copy of the repo with its own branch, so there are no working directory conflicts between agents.
After running Horizon, your project will have:
your-project/
├── .horizon/ # Runtime data (gitignored)
│ ├── env # Configuration and credentials
│ ├── mcp.json # MCP configuration for Claude Code
│ ├── prompts/ # Agent prompt templates (synced from package)
│ ├── output/ # Runtime logs
│ ├── worktrees/ # Git worktrees for parallel agents
│ └── attachments/ # Downloaded issue attachments
├── horizon-docs/ # Work artifacts (committed)
│ ├── research/ # Research documents
│ ├── plans/ # Implementation plans
│ ├── validation/ # Validation reports
│ ├── oneshot/ # Oneshot completions
│ ├── specifications/ # Feature specifications
└── CLAUDE.md # Your project's Claude instructions
The horizon-docs/ folder contains the work artifacts for Horizon. You can use this folder to track the work that Horizon has done.
However, the main purpose of this folder is for the agent to document its work and historical changes, which are valuable for understanding the codebase evolution and development of future features.
Set these in .horizon/env or export them:
| Variable | Description | Default |
|---|---|---|
LINEAR_API_KEY | Your Linear API key | (required) |
LINEAR_TEAM_KEY | Linear team identifier (e.g., "RSK") | (required) |
HORIZON_PROVIDER | AI provider: "claude" or "codex" | "claude" |
HORIZON_CLAUDE_MODEL | Claude model: "opus", "sonnet", "haiku" | "opus" |
HORIZON_MAX_ITERATIONS | Stop after N iterations (0 = unlimited) | 0 |
HORIZON_MERGE_MODE | Merge mode: "auto", "merge", or "pr" | "auto" |
Horizon supports three modes for completing work:
Auto (default)
export HORIZON_MERGE_MODE=auto
The agent decides the safest path — merge directly for small changes, create a PR for larger ones.
Direct Merge
export HORIZON_MERGE_MODE=merge
Horizon merges completed work directly to main. Best for trusted autonomous operation.
Pull Request
export HORIZON_MERGE_MODE=pr
Horizon creates a pull request instead of merging. The ticket moves to ∞ Awaiting Merge status until a human reviews and merges the PR. Best for teams that want human oversight.
When using Codex (HORIZON_PROVIDER=codex), configure Linear MCP in Codex:
codex mcp add linear --url https://mcp.linear.app/mcp
horizon # Run the main development loop
horizon config # Configure Horizon settings
horizon uninstall # Remove Horizon from current project
horizon --help # Show help
horizon --version # Show version
Horizon automatically checks for updates once per day. When a new version is available, you'll see a notification on startup:
Update available: 0.1.3 → 0.1.4
Run: npm install -g @ob1-sg/horizon@latest
Update with:
npm install -g @ob1-sg/horizon@latest
Horizon works best with clear, specific tickets:
Good ticket:
Add a dark mode toggle to the settings page. Should save preference to localStorage and apply a .dark-theme class to the body.
Tips:
Horizon creates these statuses in Linear:
Backlog:
Backlog (default)Ready statuses (waiting for Horizon):
∞ Needs Research∞ Needs Specification (optional - when UX decisions are needed)∞ Needs Plan∞ Needs Implement∞ Needs ValidateIn Progress statuses (Horizon is working):
∞ Research In Progress∞ Specification In Progress∞ Plan In Progress∞ Implement In Progress∞ Validate In Progress∞ Oneshot In ProgressIntervention statuses (requires human action):
∞ Blocked - Agent needs clarification or decision before proceeding∞ Awaiting Merge - Work complete, PR awaiting human review/merge (PR mode only)Terminal statuses:
∞ Done∞ CanceledIf you want to contribute or modify Horizon:
See CONTRIBUTING.md for release process and maintainer guidelines.
Horizon builds on ideas and techniques from the AI engineering community:
MIT
FAQs
Turn Linear Tickets into Pull Requests with Parallel Agents
We found that @ob1-sg/horizon demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.