{"id":47781653,"url":"https://github.com/roackb2/heddle","last_synced_at":"2026-05-31T11:00:49.149Z","repository":{"id":344354025,"uuid":"1175652412","full_name":"roackb2/heddle","owner":"roackb2","description":"An open-source terminal coding agent runtime and CLI for real project work.","archived":false,"fork":false,"pushed_at":"2026-05-25T07:34:52.000Z","size":13852,"stargazers_count":8,"open_issues_count":8,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-25T09:18:06.936Z","etag":null,"topics":["agent-framework","agent-memory","agent-observability","agent-runtime","agentic-coding","autonomous-agent","cli-agent","coding-agent","heartbeat","knowledge-persistence","provider-agnostic","semantic-drift","terminal-agent"],"latest_commit_sha":null,"homepage":"https://heddleagent.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/roackb2.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-03-08T01:38:50.000Z","updated_at":"2026-05-25T03:35:52.000Z","dependencies_parsed_at":"2026-04-17T18:01:26.179Z","dependency_job_id":null,"html_url":"https://github.com/roackb2/heddle","commit_stats":null,"previous_names":["roackb2/heddle"],"tags_count":32,"template":false,"template_full_name":null,"purl":"pkg:github/roackb2/heddle","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roackb2%2Fheddle","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roackb2%2Fheddle/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roackb2%2Fheddle/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roackb2%2Fheddle/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/roackb2","download_url":"https://codeload.github.com/roackb2/heddle/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roackb2%2Fheddle/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33506653,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T03:12:49.672Z","status":"ssl_error","status_checked_at":"2026-05-26T03:12:47.976Z","response_time":63,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent-framework","agent-memory","agent-observability","agent-runtime","agentic-coding","autonomous-agent","cli-agent","coding-agent","heartbeat","knowledge-persistence","provider-agnostic","semantic-drift","terminal-agent"],"created_at":"2026-04-03T13:32:57.890Z","updated_at":"2026-05-31T11:00:49.133Z","avatar_url":"https://github.com/roackb2.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Heddle\n\nHeddle is an open-source AI coding agent runtime and terminal-first workspace for real project work.\n\nOfficial website: [heddleagent.com](https://heddleagent.com)\n\n\u003e **New web and mobile control plane is out.** Run `heddle daemon` to try the new browser UI for sessions, tasks, workspace switching, memory status, and mobile review. [See the browser control plane](#browser-control-plane-overview).\n\nIt is designed for workflows where an agent needs to inspect a live repository, make bounded changes, verify results, keep continuity across sessions, and stay observable to the operator. Heddle supports OpenAI and Anthropic models, stores local workspace state under `.heddle/`, includes both a terminal chat experience and a browser control plane, learns durable workspace knowledge while it works, and gives users a review path for file diffs, commands, approvals, and traces.\n\nIn plain terms: Heddle is for people who want an AI coding assistant that can work inside actual projects, learn each project's operating knowledge over time, switch between local workspaces, and remain inspectable instead of acting like a black box.\n\n## Why Try Heddle\n\nHeddle is aimed at people who want more than a one-shot coding chat wrapper or stateless AI code assistant.\n\nIt is a good fit if you want:\n\n- a terminal-first coding agent that works in a real repository\n- an agent that learns durable project knowledge while working with you, using inspectable local memory\n- explicit traces, approvals, and reviewable workflow artifacts\n- a browser control plane for local oversight, workspace switching, and session review\n- a path from interactive use to programmatic and scheduled agent workflows\n\nHeddle is probably not the right fit if you only want a very simple one-shot prompt runner and do not care about sessions, persistence, observability, or operator control.\n\n## What Heddle Does\n\nAt a high level, Heddle helps with:\n\n- understanding unfamiliar repositories\n- making code or doc changes inside a real workspace\n- running bounded verification like builds, tests, and repo review\n- keeping multi-step work going across sessions instead of starting from scratch each time\n- switching between local workspaces from the browser control plane\n- learning durable facts, preferences, and workflows from real usage\n- exposing more operator visibility than a black-box chat tool\n\nIf you want a terminal-first coding agent with local state, review traces, workspace memory, and a path toward longer-running workflows, that is the problem Heddle is trying to solve.\n\n## Programmatic Use Layers\n\nHeddle currently has two main programmatic layers:\n\n- `createConversationEngine`: an alpha API for persisted multi-turn sessions with session storage, compaction, approvals, traces, semantic activity, and custom frontends or local hosts\n- `AgentLoopRuntimeService.run(...)`: a lower-level single-run execution loop for hosts that do not need persisted chat or session behavior\n\nAdvanced hosts can also reuse lower-level class APIs such as `ToolRegistry`,\n`ToolExecutionService`, `TraceRecorder`, `TraceConsoleFormatter`, and\n`ReviewDiffParser` when they intentionally assemble custom runtime or review\nsurfaces.\n\nIf you want the programmatic surface, start with the [Programmatic use guide](docs/guides/programmatic-use.md).\n\nFor contributors, the compact architecture map lives in\n[Core Layering](docs/architecture/core-layering.md) and\n[Chat Layering](docs/architecture/chat-layering.md).\n\n## See Heddle\n\n### Terminal coding workflow\n\nHeddle working in the terminal with live progress, tool activity, plans, and review output:\n\n![Heddle terminal coding workflow](docs/images/terminal-active-run.png)\n\nHeddle can inspect files, search with ignore-aware fallbacks, explain code, make edits, run shell commands with the right approval model, and carry a task through multiple turns. Terminal chat keeps long-running turns visible with tool activity, dim `Thinking:` progress text, real-time assistant markdown, and clearer approval prompts for repeated commands or searches.\n\n### Terminal change review\n\nTerminal chat/dev workflow showing file edits, inline diff output, and verification-oriented follow-through:\n\n![Heddle terminal change review](docs/images/terminal-change-review.png)\n\n### Browser control plane overview\n\nThe default local control plane is the web-v2 browser client served by `heddle daemon`. It is the oversight surface for coding sessions, workspace state, current changes, heartbeat tasks, and settings:\n\n![Heddle web-v2 control plane](docs/images/control-plane-v2.png)\n\nThe web-v2 client includes:\n\n- `Sessions`: saved conversations, live assistant streaming, tool progress, approvals, and current workspace diff review.\n- `Composer controls`: model and reasoning settings, semantic drift controls, `@file` mentions, and image attachments saved as local paths for `view_image`.\n- `Workspace switching`: sidebar workspace selection plus `Settings \u003e Workspace` for registering, renaming, and switching local projects.\n- `Tasks`: heartbeat task creation, edit, enable/disable, run, resume, delete, live run state, and saved run records.\n- `Settings`: language preferences, workspace management, and memory status with catalog health, note counts, pending candidates, and latest maintenance run.\n- `Mobile`: focused panels for session list, conversation workbench, task detail, settings, and diff review.\n\nThe task workbench covers recurring heartbeat tasks, live run state, and run result review:\n\n![Heddle web-v2 heartbeat task workbench](docs/images/control-plane-v2-heartbeat-task.png)\n\nThe same control plane supports mobile layouts, with the session list, workbench, and diff preview exposed as focused panels:\n\n\u003cp\u003e\n  \u003cimg src=\"docs/images/control-plane-v2-session-list.PNG\" alt=\"Heddle web-v2 mobile session list\" width=\"220\"\u003e\n  \u003cimg src=\"docs/images/control-plane-v2-workbench.PNG\" alt=\"Heddle web-v2 mobile workbench\" width=\"220\"\u003e\n  \u003cimg src=\"docs/images/control-plane-v2-diff-view.PNG\" alt=\"Heddle web-v2 mobile diff preview\" width=\"220\"\u003e\n\u003c/p\u003e\n\n## 2-Minute Try-It Path\n\n1. Install Heddle:\n\n```bash\nnpm install -g @roackb2/heddle\n```\n\n2. Configure provider access.\n\nFor OpenAI, you can either sign in with your own ChatGPT/Codex account:\n\n```bash\nheddle auth login openai\n```\n\nOr use a Platform API key:\n\n```bash\nexport OPENAI_API_KEY=your_key_here\n```\n\nIf you keep both a stored OpenAI OAuth credential and an API key around for testing, you can explicitly prefer the API key for a run:\n\n```bash\nheddle --prefer-api-key\nheddle --prefer-api-key ask \"Summarize this repository\"\nheddle --prefer-api-key daemon\n```\n\nFor Anthropic, use an API key:\n\n```bash\nexport ANTHROPIC_API_KEY=your_key_here\n```\n\nOpenAI account sign-in is an experimental, user-selected transport for Heddle. It is not official OpenAI support, and Heddle is not affiliated with, endorsed by, or sponsored by OpenAI. Use of OpenAI services remains subject to OpenAI's terms and policies.\n\n3. Move into any repository you want to inspect:\n\n```bash\ncd /path/to/project\n```\n\n4. Start chat:\n\n```bash\nheddle\n```\n\n5. Try a prompt like:\n\n```text\nSummarize this repository, show me the main build/test commands, and point out the likely entrypoints.\n```\n\n6. If you want the browser oversight UI too:\n\n```bash\nheddle daemon\n```\n\nOpen the browser control plane from the daemon output. From there you can use `Sessions`, `Tasks`, and `Settings` to inspect the active workspace, continue saved sessions, review changes, inspect memory status, and switch to another local project.\n\nIf you prefer a one-shot CLI run instead of interactive chat, use:\n\n```bash\nheddle ask \"Summarize this repository\"\n```\n\n`ask` still exits after one prompt, but it now records the run as a one-off saved session under `.heddle/` so traces, memory maintenance, and later inspection use the same persisted conversation path as normal sessions.\n\nThe terminal chat footer and the control-plane session composer both show the active auth source for the selected model, so you can tell whether a session is using OpenAI account sign-in, API-key mode, or missing credentials.\n\n### Try The Learning Loop\n\nHeddle gets more useful when it learns a reusable preference and applies it later. In chat, teach it a ticket format:\n\n```text\nWhenever I ask you to create a ticket, use these sections: problem statement, proposed approach, considered alternatives, conclusion.\n```\n\nThen start a fresh session and ask:\n\n```text\nCreate a ticket for maintaining doc consistency after feature updates.\n```\n\nHeddle should recover the preference from its local memory catalog and produce the ticket in that structure. You can inspect what it learned with:\n\n```bash\nheddle memory status\nheddle memory list\nheddle memory search ticket\n```\n\n## Major Features\n\n### Terminal chat for real coding work\n\nThe main way to use Heddle is interactive chat in a repository:\n\n```bash\nheddle\n```\n\nFrom there, Heddle can inspect files, explain code, make edits, run shell commands with the right approval model, and carry a task through multiple turns.\n\nThis is the core feature. If you only use Heddle as a coding agent in the terminal, this is the part you care about.\n\nThe terminal composer supports multiline prompts, prompt undo/redo, prompt history navigation, model picking with `/model set`, and reasoning-effort picking with `/reasoning set`. During a run, Heddle streams visible activity so you can see whether it is thinking, searching, calling tools, updating a plan, or waiting for approval.\n\nMore: [Chat and sessions guide](docs/guides/chat-and-sessions.md)\n\n### Terminal UI v2 status\n\n`cli-v2` is actively under development, but it is not released as the default terminal experience yet. The current work is intentionally architectural: the new TUI consumes the same local control-plane API as the browser UI and does not reach directly into core services.\n\nFor users, the goal is one behavior model across interfaces. A saved conversation, selected model, reasoning setting, approval state, and live run status should be the same whether you are looking from the terminal, the browser control plane, or another device connected to the same local daemon. Conversation state is inherently synchronized because each interface is a client of the same session/control-plane path rather than a separate runtime.\n\nFor contributors, the goal is a cleaner implementation path: TUI-specific rendering and keyboard behavior stay in `cli-v2`, shared semantics stay in core and server-owned control-plane APIs, and future advanced features can build on a maintainable API-first foundation instead of duplicating command/session logic in each interface.\n\n### Project instructions\n\nHeddle can load a short project instruction file at startup so a fresh session starts with the repository's operating context. By default it loads the first non-empty file found in this order: `HEDDLE.md`, `AGENTS.md`, `CLAUDE.md`.\n\nOnly one default file is loaded to preserve context space. If a project needs a different path or intentionally wants multiple files, set `agentContextPaths` in `heddle.config.json`.\n\nMore: [Project config](docs/reference/config.md)\n\n### Sessions and continuity\n\nHeddle keeps saved sessions under `.heddle/` so longer work does not have to reset every time. Current versions store the session catalog at `.heddle/chat-sessions.catalog.json` and per-session bodies under `.heddle/chat-sessions/`. That means you can come back to an interrupted task, continue a previous debugging thread, or preserve project-specific context across runs.\n\nThis matters if you are doing real multi-step work rather than one-shot prompts.\n\nTypical session commands include:\n\n- `/session list`\n- `/session switch \u003cid\u003e`\n- `/continue`\n- `/compact`\n- `/model set`\n- `/reasoning set`\n\nMore: [Chat and sessions guide](docs/guides/chat-and-sessions.md)\n\n### Knowledge Persistence: Heddle Learns While It Works\n\nHeddle can learn durable project knowledge while it works with you.\n\nWhen the agent notices reusable information — a preferred ticket format, a canonical verification command, an operational convention, a recurring repo quirk, or a stable workflow pattern — it can record a memory candidate and let a dedicated maintainer path fold that knowledge into cataloged markdown notes under `.heddle/memory/`.\n\nThe goal is practical recall: future sessions should know where to look instead of rediscovering the same context from scratch. Heddle does this through explicit catalogs, readable local notes, maintenance logs, and memory visibility commands rather than opaque retrieval.\n\nThe learning loop is intentionally concrete:\n\n- notices durable facts and preferences during normal work\n- records memory candidates without interrupting the user\n- folds candidates into cataloged markdown through a maintainer path\n- lets future sessions recover context through explicit discovery paths\n- lets users audit memory with `heddle memory status/list/read/search/validate`\n\nTry it on a real project: tell Heddle a durable preference or let it discover a stable workflow detail, then start a fresh session and watch it recover that context through the memory catalog.\n\nFor example, tell Heddle your preferred ticket template once, then ask for a ticket in a new session. The point is not just storing a note; it is making future work start from the operating knowledge you already taught the agent.\n\nMore: [Knowledge persistence](docs/guides/knowledge-persistence.md)\n\n### Control plane and workspaces\n\nThe control plane is Heddle's local browser UI:\n\n```bash\nheddle daemon\n```\n\nIt gives you a browser-based view into workspaces, sessions, run state, heartbeat tasks, memory health, and review-oriented details. The purpose is operator oversight: seeing what the agent is doing, reviewing history more comfortably, and managing local runs from a UI instead of only from the terminal.\n\nIf terminal chat is the execution surface, the control plane is the oversight surface.\n\nThe workspace switcher and `Settings \u003e Workspace` page let you register local projects, switch the control plane between them, rename workspace entries, and pick a project folder from the browser UI. Heddle also keeps a user-level workspace registry so projects you have opened from the CLI or daemon can be rediscovered later.\n\nThe `Sessions` section supports a coding-review flow built around current work first. Review starts from the live Git working tree for the active workspace, with changed files, structured read-only diffs, and a larger full-diff viewer when the side panel is too tight. Historical turn diffs, review commands, verification commands, approvals, and trace events are still available, but they are separated from current review so old evidence does not distract from the task at hand.\n\nSession chat in the control plane renders assistant markdown, receives per-session live updates for assistant streaming, tool progress, approvals, and saved-session refreshes, and keeps model/reasoning controls aligned with the terminal workflow. The session composer also includes drift controls, `@file` mention suggestions, and image upload controls for attaching local screenshots or reference images to a prompt.\n\nThe task surface has also moved beyond passive visibility: operators can create, edit, enable, disable, run, resume, and delete heartbeat tasks, inspect live run state, and review saved run records from the browser. Settings now include workspace and memory status views, so memory catalog health and maintenance history are visible without dropping back to terminal commands.\n\nThis is useful if you want a more inspectable and operator-friendly workflow than a plain CLI transcript. The layout adapts for phone use as well, with mobile-native navigation for Sessions, Tasks, and Settings, plus focused Chat/Review and task-run workflows.\n\nMore: [Control plane guide](docs/guides/control-plane.md)\n\n### Runtime host model\n\nHeddle is local-first, but it still has a runtime ownership model.\n\nThe short version is:\n\n- the workspace is the project-level state and ownership unit\n- one workspace should have one live runtime owner at a time\n- that owner is either:\n  - the embedded CLI command you started\n  - or a background `heddle daemon`\n\nThis is why Heddle stores state under the workspace’s `.heddle/`, why the browser control plane acts as a client of the daemon rather than a separate runtime, and why the UI treats workspace switching as choosing which local `.heddle/` state to inspect and operate.\n\nIf you want to understand how `chat`, `ask`, the daemon, the control plane, and workspace-local state fit together, read:\n\n- [Runtime host model](docs/guides/runtime-host-model.md)\n\n### Heartbeat\n\nHeartbeat is Heddle's model for bounded autonomous wake cycles.\n\nInstead of only running when a human types a prompt, a heartbeat task lets Heddle wake up on a schedule, do a limited amount of work, checkpoint the result, and decide whether to continue, pause, complete, or escalate.\n\nHeartbeat keeps the latest runner result and saved run history in the same\nrecord shape, so terminal commands and the browser control plane show the same\ndecision, summary, outcome, and usage data. Tasks can use operator-controlled\ncontinuation or agent-selected continuation depending on how much autonomy the\nhost should allow.\n\nExample commands:\n\n```bash\nheddle heartbeat start --every 30m\nheddle heartbeat task add --id repo-gardener --task \"Check for safe maintenance work\" --every 1h\nheddle heartbeat task list\n```\n\nWhy this exists: some agent work is not a single interactive chat. You may want periodic repo inspection, recurring maintenance checks, scheduled summaries, or a host that can resume work in bounded steps.\n\nIf you do not need scheduled or semi-autonomous workflows, you can ignore heartbeat entirely and just use chat.\n\nMore: [Heartbeat guide](docs/guides/heartbeat.md)\n\n### Semantic drift\n\nSemantic drift is optional telemetry that helps you see whether the assistant's responses appear to be moving away from the recent semantic trajectory of the conversation.\n\nWith optional [CyberLoop](https://www.npmjs.com/package/cyberloop) integration installed, Heddle can surface drift levels such as:\n\n- `drift=unknown`\n- `drift=low`\n- `drift=medium`\n- `drift=high`\n\nThis is an observability feature, not a magic correctness guarantee. It is meant to help operators notice when a run may be getting less aligned with its recent direction.\n\nIf you are just looking for a coding agent, you do not need to care about this on day one. If you care about agent observability and runtime behavior, it is one of Heddle's more distinctive features.\n\nMore: [Semantic drift](docs/guides/semantic-drift.md)\n\n### Programmatic runtime APIs\n\nHeddle is not only a CLI. The npm package also exposes runtime primitives such as `createConversationEngine`, `AgentLoopRuntimeService.run(...)`, `HeartbeatRunnerAgent.run`, `HeartbeatSchedulerService.runDueTasks`, and `FileHeartbeatTaskService` so other hosts can build on top of it.\n\nThis is for people building their own agent hosts, schedulers, or control surfaces rather than only using the packaged CLI.\n\nMore: [Programmatic use](docs/guides/programmatic-use.md)\n\n## Install\n\nGlobal install:\n\n```bash\nnpm install -g @roackb2/heddle\n```\n\nRun without a global install:\n\n```bash\nnpx @roackb2/heddle\n```\n\nThe installed CLI command is `heddle`.\n\n## Requirements\n\n- Node.js 20+\n- access to at least one supported provider:\n  - OpenAI account sign-in with `heddle auth login openai`, or `OPENAI_API_KEY`\n  - `ANTHROPIC_API_KEY` for Anthropic models\n\nHeddle intentionally does not support Anthropic consumer subscription OAuth. Use Anthropic API-key access unless Anthropic provides an approved third-party auth route.\n\n## Optional CyberLoop Integration\n\nIf you want semantic drift telemetry in chat, install `cyberloop` in the same environment as Heddle:\n\n```bash\nnpm install -g cyberloop\n# or for project-local usage\nnpm install cyberloop\n```\n\nFor one-off usage without a global install:\n\n```bash\nnpx -p @roackb2/heddle -p cyberloop heddle\n```\n\n## Documentation\n\n### Start here\n\n- [Documentation hub](docs/README.md)\n- [Runtime host model](docs/guides/runtime-host-model.md)\n- [Chat and sessions guide](docs/guides/chat-and-sessions.md)\n- [CLI reference](docs/reference/cli.md)\n\n### Feature guides\n\n- [Runtime host model](docs/guides/runtime-host-model.md)\n- [Control plane](docs/guides/control-plane.md)\n- [Heartbeat](docs/guides/heartbeat.md)\n- [Knowledge persistence](docs/guides/knowledge-persistence.md)\n- [Semantic drift](docs/guides/semantic-drift.md)\n- [Programmatic use](docs/guides/programmatic-use.md)\n\n### Contributors\n\n- [Agent context](docs/agent-context.md)\n- [Project posture](docs/project-posture.md)\n- [Development and contributing](docs/guides/development.md)\n- [Release convention](docs/releases/README.md)\n- [Framework Vision](docs/strategy/framework-vision.md)\n- [Coding Agent Roadmap](docs/strategy/coding-agent-roadmap.md)\n\n## Project Status\n\nHeddle is already useful for real coding-agent workflows, but it is still evolving.\n\nCurrent strengths include:\n\n- terminal-first coding and repository workflows\n- autonomous, catalog-backed workspace memory that helps the agent learn from normal usage\n- explicit traces, approval previews, diff review, and local workspace state\n- browser-based oversight and workspace switching through the control plane\n- local-first heartbeat primitives for scheduled agent work\n- practical programmatic hooks for custom hosts\n\nCurrent limitations include:\n\n- the browser control plane is read-only for file review; it is not yet an editable IDE-like diff environment\n- some advanced workflows remain better documented in source and examples than in polished product UX\n- the project surface is still changing as the runtime matures\n\n## Development\n\nIf you want to work on Heddle itself:\n\n```bash\ngit clone https://github.com/roackb2/heddle.git\ncd heddle\nyarn install\nyarn build\nyarn test\n```\n\n`yarn test` runs the default unit and integration suites. Browser integration coverage lives under `src/__tests__/browser-integration` and runs on PRs; run it locally with `yarn test:browser-integration`.\n\nSee [Development and contributing](docs/guides/development.md) for the fuller contributor workflow.\n\n## License\n\nHeddle is licensed under the MIT License. See [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Froackb2%2Fheddle","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Froackb2%2Fheddle","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Froackb2%2Fheddle/lists"}