{"id":50988359,"url":"https://github.com/cobusgreyling/loop-engineering","last_synced_at":"2026-07-07T22:00:51.469Z","repository":{"id":363506743,"uuid":"1263648864","full_name":"cobusgreyling/loop-engineering","owner":"cobusgreyling","description":"Practical patterns, starters \u0026 CLI tools for loop engineering with AI coding agents. Design systems that prompt and orchestrate agents (inspired by Addy Osmani and Boris Cherny). Includes loop-audit, loop-init, loop-cost.","archived":false,"fork":false,"pushed_at":"2026-07-04T18:04:58.000Z","size":1974,"stargazers_count":5608,"open_issues_count":13,"forks_count":725,"subscribers_count":34,"default_branch":"main","last_synced_at":"2026-07-04T19:12:28.386Z","etag":null,"topics":["agentic-ai","ai-agents","ai-coding","anthropic","automation","claude","claude-code","codex","coding-agents","devops-automation","devtools","github-actions","grok","llm","loop-engineering","mcp","prompt-engineering"],"latest_commit_sha":null,"homepage":"https://cobusgreyling.github.io/loop-engineering/","language":"JavaScript","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/cobusgreyling.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":"SECURITY.md","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},"funding":{"github":["cobusgreyling"]}},"created_at":"2026-06-09T06:28:20.000Z","updated_at":"2026-07-04T19:00:14.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/cobusgreyling/loop-engineering","commit_stats":null,"previous_names":["cobusgreyling/loop-engineering"],"tags_count":23,"template":false,"template_full_name":null,"purl":"pkg:github/cobusgreyling/loop-engineering","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cobusgreyling%2Floop-engineering","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cobusgreyling%2Floop-engineering/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cobusgreyling%2Floop-engineering/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cobusgreyling%2Floop-engineering/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cobusgreyling","download_url":"https://codeload.github.com/cobusgreyling/loop-engineering/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cobusgreyling%2Floop-engineering/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35243953,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-07T02:00:07.222Z","response_time":90,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["agentic-ai","ai-agents","ai-coding","anthropic","automation","claude","claude-code","codex","coding-agents","devops-automation","devtools","github-actions","grok","llm","loop-engineering","mcp","prompt-engineering"],"created_at":"2026-06-19T23:00:32.341Z","updated_at":"2026-07-07T22:00:51.459Z","avatar_url":"https://github.com/cobusgreyling.png","language":"JavaScript","funding_links":["https://github.com/sponsors/cobusgreyling"],"categories":["JavaScript"],"sub_categories":[],"readme":"# Loop Engineering\n\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://cobusgreyling.github.io/loop-engineering/\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/✨_Explore_the_Showcase-Design_systems_that_prompt_your_agents-0d1117?style=for-the-badge\u0026labelColor=111a28\u0026color=3ee8c5\" alt=\"Explore the Showcase\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/cobusgreyling/loop-engineering/stargazers\"\u003e\u003cimg src=\"https://img.shields.io/github/stars/cobusgreyling/loop-engineering?style=social\" alt=\"GitHub stars\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/cobusgreyling/loop-engineering/actions/workflows/audit.yml\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/cobusgreyling/loop-engineering/audit.yml?label=loop-audit%20dogfood\" alt=\"loop-audit dogfood\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/@cobusgreyling/loop-audit\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/@cobusgreyling/loop-audit?label=loop-audit\" alt=\"loop-audit npm\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/@cobusgreyling/loop-init\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/@cobusgreyling/loop-init?label=loop-init\" alt=\"loop-init npm\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/@cobusgreyling/loop-cost\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/@cobusgreyling/loop-cost?label=loop-cost\" alt=\"loop-cost npm\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/@cobusgreyling/loop-sync\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/@cobusgreyling/loop-sync?label=loop-sync\" alt=\"loop-sync npm\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/@cobusgreyling/loop-context\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/@cobusgreyling/loop-context?label=loop-context\" alt=\"loop-context npm\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/@cobusgreyling/loop-mcp-server\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/@cobusgreyling/loop-mcp-server?label=loop-mcp-server\" alt=\"loop-mcp-server npm\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/@cobusgreyling/loop-worktree\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/@cobusgreyling/loop-worktree?label=loop-worktree\" alt=\"loop-worktree npm\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/cobusgreyling/loop-engineering/blob/main/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-blue.svg\" alt=\"MIT\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://cobusgreyling.github.io/loop-engineering/\"\u003e\u003cimg src=\"https://img.shields.io/badge/GitHub_Pages-live%20%7C%20interactive-3ee8c5\" alt=\"Pages\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://cobusgreyling.github.io/loop-engineering/\"\u003e\n    \u003cimg src=\"assets/visuals/loop-engineering-logo.svg\" alt=\"Loop Engineering logo\" width=\"88\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003e **Stop prompting. Design the loop. Get a score.**\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/visuals/LE5.jpeg\" alt=\"Loop Engineering — design the system that prompts your agents\" width=\"100%\" /\u003e\n\u003c/p\u003e\n\n```bash\nnpx @cobusgreyling/loop-init .\n```\n\n`loop-init` scaffolds skills, state, and budget files, then prints your **Loop Ready** score and first loop command. Swap `--tool` for `claude`, `codex`, or `opencode`.\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"docs/QUICKSTART.md\"\u003e\n    \u003cimg src=\"assets/visuals/loop-audit-demo.gif\" alt=\"Loop Ready score climbs from 10 to 100 in 15 seconds\" width=\"100%\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\nLoop engineering replaces you as the person who prompts the agent — you design the system that does it instead.\n\n**New here?** [Quickstart (5 min)](docs/QUICKSTART.md) · [Interactive picker](https://cobusgreyling.github.io/loop-engineering/#interactive)\n\nFor developers using Grok, Claude Code, Codex, Cursor, and other AI coding agents.\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003e\u003ca href=\"https://cobusgreyling.github.io/loop-engineering/\"\u003e→ Interactive showcase + pattern picker\u003c/a\u003e\u003c/strong\u003e\n  ·\n  \u003ca href=\"https://cobusgreyling.substack.com/p/loop-engineering\"\u003eEssay\u003c/a\u003e\n  ·\n  \u003ca href=\"https://addyosmani.com/blog/loop-engineering/\"\u003eAddy Osmani\u003c/a\u003e\n\u003c/p\u003e\n\n## Contents\n\n- [Quickstart (5 min)](docs/QUICKSTART.md)\n- [Quick Links](#quick-links)\n- [Why This Matters](#why-this-matters)\n- [The Five Building Blocks + Memory](#the-five-building-blocks--memory)\n- [Patterns](#patterns)\n- [Getting Started (5 minutes)](#getting-started-5-minutes)\n- [Examples by Tool](#examples-by-tool)\n- [Operating \u0026 Safety](#operating--safety)\n- [Caveats](#caveats)\n- [Contributing](#contributing)\n- [Sources](#sources)\n- [License](#license)\n\n## Quick Links\n\n| Start here | Description |\n|------------|-------------|\n| [Quickstart (5 min)](docs/QUICKSTART.md) | Scaffold → cost check → audit → first loop — **start here if you just landed** |\n| [Loop Engineering essay](https://cobusgreyling.substack.com/p/loop-engineering) | The concept, primitives, and Grok mapping — read for the why |\n| [Pattern Picker](docs/pattern-picker.md) | Which loop to run first — **start here if unsure** |\n| [Primitives Matrix](docs/primitives-matrix.md) | Cross-tool loop primitive mapping — bookmark this |\n| [Loop Design Checklist](docs/loop-design-checklist.md) | Ship readiness rubric |\n| [Patterns](patterns/README.md) | 7 production patterns + [interactive picker](https://cobusgreyling.github.io/loop-engineering/#interactive) |\n| [Starters](starters/) | Clone-and-run kits (Grok, Claude Code, Codex, Opencode) |\n| [Opencode examples](examples/opencode/) | CLI-first loops: cron/systemd + `opencode run`, skills, worktrees |\n| [loop-audit](tools/loop-audit/) | Loop Readiness Score CLI (v1.5 + constraints scoring) — `npx @cobusgreyling/loop-audit . --suggest` · `--badge` for README |\n| [loop-init](tools/loop-init/) | Scaffold starters + budget/run-log + constraints (v1.2) — `npx @cobusgreyling/loop-init . --pattern daily-triage --tool grok` |\n| [loop-cost](tools/loop-cost/) | Token spend estimator — `npx @cobusgreyling/loop-cost` |\n| [loop-sync](tools/loop-sync/) | Drift detection between `STATE.md` and `LOOP.md` — `npx @cobusgreyling/loop-sync .` |\n| [loop-context](tools/loop-context/) | Stateful memory manager + circuit breaker for long runs — `npx @cobusgreyling/loop-context --check --ledger run.json` |\n| [loop-mcp-server](tools/mcp-server/) | MCP runtime lookup for patterns, skills, state — `npx @cobusgreyling/loop-mcp-server` |\n| [loop-worktree](tools/loop-worktree/) | Manage isolated git worktrees per fix attempt — `npx @cobusgreyling/loop-worktree create --run-id \u003cid\u003e --pattern \u003cp\u003e` |\n| [Goal Engineering](https://github.com/cobusgreyling/goal-engineering) | **Companion:** loops discover, goals finish — `/goal` + [stack cookbook](https://github.com/cobusgreyling/goal-engineering/blob/main/docs/stack-cookbook.md) (`npx @cobusgreyling/goal doctor .`) |\n| [Stories](stories/) | Real wins and honest failures |\n| [Contributor quickstart](https://github.com/cobusgreyling/loop-engineering/discussions/123) | **Help wanted:** 17 scoped `good first issues` — comment *I'll take this* to get assigned |\n| [Community update](https://github.com/cobusgreyling/loop-engineering/discussions/145) | **July 4:** 5.5k stars, traffic sources, contributor merges |\n| [Prior release notes](https://github.com/cobusgreyling/loop-engineering/discussions/89) | v1.5.0 — loop-sync, constraints, MCP server |\n| [Add your project](https://github.com/cobusgreyling/loop-engineering/discussions/92) | **Pinned:** Loop Ready badge + adopters list |\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/visuals/section-divider.svg\" alt=\"\" width=\"100%\" /\u003e\n\u003c/p\u003e\n\n## Why This Matters\n\nPeter Steinberger:\n\u003e “You shouldn’t be prompting coding agents anymore. You should be designing loops that prompt your agents.”\n\nBoris Cherny (Head of Claude Code at Anthropic):\n\u003e “I don’t prompt Claude anymore. I have loops running that prompt Claude and figuring out what to do. My job is to write loops.”\n\nThe leverage point has moved from crafting individual prompts to designing the control systems that orchestrate agents over time.\n\n## The Five Building Blocks + Memory\n\n| Primitive | Job in the Loop |\n|-----------|-----------------|\n| **Automations / Scheduling** | Discovery + triage on a cadence |\n| **Worktrees** | Safe parallel execution |\n| **Skills** | Persistent project knowledge |\n| **Plugins \u0026 Connectors** | Reach into your real tools (MCP) |\n| **Sub-agents** | Maker / checker split |\n| **+ Memory / State** | Durable spine outside any conversation |\n\nFull detail: [docs/primitives.md](docs/primitives.md) · Cross-tool matrix: [docs/primitives-matrix.md](docs/primitives-matrix.md)\n\n### Visual Overview\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/visuals/primitives-infographic.jpg\" alt=\"The Five Building Blocks + Memory — Loop Engineering\" width=\"100%\" /\u003e\n\u003c/p\u003e\n\n### Anatomy of a Loop\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/visuals/loop-cycle-animated.svg\" alt=\"Animated loop flow — schedule, triage, state, worktree, implement, verify, MCP, human gate\" width=\"100%\" /\u003e\n\u003c/p\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eMermaid diagram (copy-friendly)\u003c/summary\u003e\n\n```mermaid\nflowchart LR\n    A[Schedule / Automation] --\u003e B[Triage Skill]\n    B --\u003e C[Read + Write STATE / Memory]\n    C --\u003e D[Isolated Worktree]\n    D --\u003e E[Implementer Sub-agent]\n    E --\u003e F[Verifier Sub-agent\u003cbr/\u003etests + gates]\n    F --\u003e G[MCP / Git / Tickets]\n    G --\u003e H{Human Gate?}\n    H --\u003e|safe / allowlisted| I[Commit / PR / Action]\n    H --\u003e|risky / ambiguous| J[Escalate to human\u003cbr/\u003ewith full context]\n    I --\u003e A\n    J --\u003e A\n```\n\n\u003c/details\u003e\n\n**This reference repo now runs its own `validate-patterns` + `audit` workflows on every push/PR** (see `.github/workflows/`). We also added `LOOP.md` describing the loops that will maintain it.\n\n## Patterns\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/visuals/patterns-overview.svg\" alt=\"Seven production loop patterns with cadence and token cost\" width=\"100%\" /\u003e\n\u003c/p\u003e\n\n| Pattern | Cadence | Starter | Week 1 | Token cost |\n|---------|---------|---------|--------|------------|\n| [Daily Triage](patterns/daily-triage.md) | 1d–2h | [minimal-loop](starters/minimal-loop/) | **L1** report | Low |\n| [PR Babysitter](patterns/pr-babysitter.md) | 5–15m | [pr-babysitter](starters/pr-babysitter/) | L1 watch | High |\n| [CI Sweeper](patterns/ci-sweeper.md) | 5–15m | [ci-sweeper](starters/ci-sweeper/) | L2 cautious | Very high |\n| [Dependency Sweeper](patterns/dependency-sweeper.md) | 6h–1d | [dependency-sweeper](starters/dependency-sweeper/) | L2 patch-only | Medium |\n| [Changelog Drafter](patterns/changelog-drafter.md) | 1d or tag | [changelog-drafter](starters/changelog-drafter/) | **L1** draft | Low |\n| [Post-Merge Cleanup](patterns/post-merge-cleanup.md) | 1d–6h | [post-merge-cleanup](starters/post-merge-cleanup/) | **L1** off-peak | Low |\n| [Issue Triage](patterns/issue-triage.md) | 2h–1d | [issue-triage](starters/issue-triage/) | **L1** propose-only | Low |\n\nNot sure which to pick? Try the [interactive picker](https://cobusgreyling.github.io/loop-engineering/#interactive) or [pattern-picker](docs/pattern-picker.md).\n\nMachine-readable index: [patterns/registry.yaml](patterns/registry.yaml) (7 patterns)\n\n## Getting Started (5 minutes)\n\n```bash\n# 1. Scaffold + get your Loop Ready score (printed automatically)\nnpx @cobusgreyling/loop-init . --pattern daily-triage --tool grok\n\n# 2. Estimate token spend for your cadence\nnpx @cobusgreyling/loop-cost --pattern daily-triage --level L1\n\n# 3. Re-audit after improvements\nnpx @cobusgreyling/loop-audit . --suggest\n\n# Optional: paste Loop Ready badge into your README\nnpx @cobusgreyling/loop-audit . --badge\n\n# 4. See scores climb: empty → L1 → L2\nbash scripts/before-after-demo.sh\n\n# 5. Start report-only (Grok example)\n/loop 1d Run loop-triage. Update STATE.md. No auto-fix in week one.\n```\n\nAll three CLIs publish to npm from tagged releases — see [docs/RELEASE.md](docs/RELEASE.md). No clone required.\n\n**Develop from source** (monorepo contributors):\n\n```bash\ncd tools/loop-init \u0026\u0026 npm ci \u0026\u0026 npm test \u0026\u0026 node dist/cli.js /path/to/project --pattern daily-triage --tool grok\ncd tools/loop-audit \u0026\u0026 npm ci \u0026\u0026 npm test \u0026\u0026 node dist/cli.js /path/to/project --suggest\ncd tools/loop-cost \u0026\u0026 npm ci \u0026\u0026 npm test \u0026\u0026 node dist/cli.js --pattern ci-sweeper --cadence 15m\n```\n\nPhased rollout: **L1 report → L2 assisted fixes → L3 unattended** — see [loop-design-checklist](docs/loop-design-checklist.md).\n\n## Examples by Tool\n\n- [Grok](examples/grok/daily-triage.md)\n- [Claude Code](examples/claude-code/)\n- [Codex](examples/codex/)\n- [OpenClaw](examples/openclaw/daily-triage.md)\n- [Opencode](examples/opencode/)\n- [GitHub Actions](examples/github-actions/)\n\n## Operating \u0026 Safety\n\n- [Failure Modes](docs/failure-modes.md) — incident-style catalog\n- [Anti-Patterns](docs/anti-patterns.md) — design mistakes before production\n- [Multi-Loop Coordination](docs/multi-loop.md) — when loops collide\n- [Operating Loops](docs/operating-loops.md) — cost, logging, when to kill\n- [Safety](docs/safety.md) — denylist, auto-merge, MCP scopes\n- [Security](SECURITY.md) — reporting and unattended automation risks\n- [Concepts](docs/concepts.md) — intent debt, comprehension debt, harness vs loop\n- [MCP Cookbook](examples/mcp/) — connector examples by pattern\n\n## Caveats\n\nLoop engineering amplifies judgment — both good and bad.\n\n- **Token costs** can explode with sub-agents and long-running loops.\n- **Verification is still on you.** Unattended loops make unattended mistakes.\n- **Comprehension debt** grows faster unless you read what the loop ships.\n- Two people can run the same loop and get opposite results. The loop doesn't know. You do.\n\nAddy Osmani:\n\u003e “Build the loop. But build it like someone who intends to stay the engineer, not just the person who presses go.”\n\n## Help wanted\n\n**First PR?** Start with the [contributor quickstart](https://github.com/cobusgreyling/loop-engineering/discussions/123) — ~10 min to ~1 hr tasks with same-day review on stories and adopters. See [CONTRIBUTORS.md](CONTRIBUTORS.md) for everyone who has shipped so far.\n\n| Pick one | Issue |\n|----------|-------|\n| ~10 min | [#120 — Add your project to adopters](https://github.com/cobusgreyling/loop-engineering/issues/120) |\n| ~20 min | [#121 — QUICKSTART `loop-init --tool` values](https://github.com/cobusgreyling/loop-engineering/issues/121) |\n| ~1 hr | [#118](https://github.com/cobusgreyling/loop-engineering/issues/118) / [#119](https://github.com/cobusgreyling/loop-engineering/issues/119) — **failure stories welcome** |\n\nComment **\"I'll take this\"** on any [`good first issue`](https://github.com/cobusgreyling/loop-engineering/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) for assignment.\n\n## Contributing\n\nShare production patterns, tool mappings, and failure stories. See [CONTRIBUTING.md](CONTRIBUTING.md) (contribution ladder + [`good first issue` backlog](https://github.com/cobusgreyling/loop-engineering/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)), [adopters](docs/adopters.md), and [GitHub Discussions](https://github.com/cobusgreyling/loop-engineering/discussions).\n\n## Sources\n\n- [Cobus Greyling – Loop Engineering (Substack)](https://cobusgreyling.substack.com/p/loop-engineering)\n- [Addy Osmani – Loop Engineering](https://addyosmani.com/blog/loop-engineering/)\n- [Attribution \u0026 further reading](resources/sources.md)\n\n## License\n\nMIT\n\n---\n\n*Practical, tool-aware reference for loop engineering, patterns you can clone, checklists you can ship against, and stories that include what broke.*\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://cobusgreyling.substack.com/p/loop-engineering\"\u003eEssay\u003c/a\u003e\n  ·\n  \u003ca href=\"https://cobusgreyling.github.io/loop-engineering/\"\u003eShowcase\u003c/a\u003e\n  ·\n  \u003ca href=\"https://github.com/cobusgreyling\"\u003eCobus Greyling\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://cobusgreyling.github.io/loop-engineering/star-history.html\"\u003e\n    \u003cpicture\u003e\n      \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"assets/visuals/star-history-dark.svg\" /\u003e\n      \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"assets/visuals/star-history.svg\" /\u003e\n      \u003cimg alt=\"Star History Chart\" src=\"assets/visuals/star-history.svg\" /\u003e\n    \u003c/picture\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003csub\u003eStatic chart (CI-updated daily). \u003ca href=\"https://cobusgreyling.github.io/loop-engineering/star-history.html\"\u003eLive chart\u003c/a\u003e needs a GitHub token — stored in your browser only.\u003c/sub\u003e\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcobusgreyling%2Floop-engineering","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcobusgreyling%2Floop-engineering","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcobusgreyling%2Floop-engineering/lists"}