{"id":36591315,"url":"https://github.com/moru-ai/moru","last_synced_at":"2026-02-05T17:03:24.053Z","repository":{"id":331646860,"uuid":"1124030634","full_name":"moru-ai/moru","owner":"moru-ai","description":"Run AI Agents in the cloud","archived":false,"fork":false,"pushed_at":"2026-02-01T12:45:25.000Z","size":56912,"stargazers_count":44,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-01T19:11:44.478Z","etag":null,"topics":["ai","ai-agents","claude","cloud","hosting","python","sandbox","typescript"],"latest_commit_sha":null,"homepage":"https://moru.io/docs","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/moru-ai.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","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":"2025-12-28T07:02:50.000Z","updated_at":"2026-02-01T12:45:29.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/moru-ai/moru","commit_stats":null,"previous_names":["moru-ai/sdks","moru-ai/moru"],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/moru-ai/moru","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moru-ai%2Fmoru","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moru-ai%2Fmoru/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moru-ai%2Fmoru/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moru-ai%2Fmoru/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/moru-ai","download_url":"https://codeload.github.com/moru-ai/moru/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moru-ai%2Fmoru/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29126059,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-05T14:05:12.718Z","status":"ssl_error","status_checked_at":"2026-02-05T14:03:53.078Z","response_time":65,"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":["ai","ai-agents","claude","cloud","hosting","python","sandbox","typescript"],"created_at":"2026-01-12T08:15:59.930Z","updated_at":"2026-02-05T17:03:24.029Z","avatar_url":"https://github.com/moru-ai.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/moru-ai/.github/main/logo/moru-logo-white.svg\"\u003e\n    \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://raw.githubusercontent.com/moru-ai/.github/main/logo/moru-logo.svg\"\u003e\n    \u003cimg alt=\"Moru\" src=\"https://raw.githubusercontent.com/moru-ai/.github/main/logo/moru-logo.svg\" width=\"200\"\u003e\n  \u003c/picture\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cb\u003eOpen-source cloud runtime for AI agents.\u003c/b\u003e\u003cbr\u003e\n  Give your AI agents a full Linux VM to work with.\n\u003c/p\u003e\n\n---\n\nRun agent harnesses like Claude Code or Codex in the cloud, giving each session its own isolated microVM with filesystem and shell access. From outside, you talk to the VM through the Moru CLI or TypeScript/Python SDK. Inside, it's just Linux—run commands, read/write files, anything you'd do on a normal machine.\n\n## Why Moru?\n\nWhen an agent needs to solve complex problems, giving it filesystem + shell access works well because:\n\n1. It handles large data without pushing everything into the model context window\n2. It reuses tools that already work (Python, Bash, etc.)\n3. Models are trained to be good at using shell commands and writing code\n\nNow models run for hours on real tasks. As models get smarter, the harness should give models more autonomy, but with safe guardrails. Moru helps developers focus on building agents, not the underlying runtime and infra.\n\n## Quickstart\n\nThe fastest way to try Moru is with the CLI.\n\n### Install the CLI\n\n```bash\ncurl -fsSL https://moru.io/cli/install.sh | bash\n```\n\n### Hello World\n\n```bash\n# Login\nmoru auth login\n\n# Run a command and get destroyed automatically\nmoru sandbox run base echo 'hello world!'\n\n# List sandboxes\nmoru sandbox list\n\n# View logs\nmoru sandbox logs \u003cid\u003e\n```\n\n### Create/Kill\n\n```bash\n# Create a sandbox\nmoru sandbox create base\n\n# Run a command inside\nmoru sandbox exec \u003cid\u003e 'sh -c \"echo Hello Moru \u003e /tmp/note.txt\"'\n\n# Run another command\nmoru sandbox exec \u003cid\u003e cat /tmp/note.txt\n\n# Kill when done\nmoru sandbox kill \u003cid\u003e\n```\n\n## Using SDKs\n\n### Install\n\n**JavaScript / TypeScript:**\n\n```bash\nnpm install @moru-ai/core\n```\n\n**Python:**\n\n```bash\npip install moru\n```\n\n### API Key set up\n\n```bash\nexport MORU_API_KEY=your_api_key\n```\n\n**Go to the [API Keys tab](https://moru.io/dashboard?tab=keys)** if you didn't create an API key yet.\n\n### Create/Kill\n\n**JavaScript / TypeScript:**\n\n```ts\nimport Sandbox from '@moru-ai/core'\n\n// Create a sandbox using the 'base' template (default)\nconst sandbox = await Sandbox.create()\nconsole.log(`Sandbox created: ${sandbox.sandboxId}`)\n\n// Run a command\nconst result = await sandbox.commands.run(\"echo 'Hello from Moru!'\")\nconsole.log(`Output: ${result.stdout}`)\n\n// Clean up\nawait sandbox.kill()\n```\n\n**Python:**\n\n```python\nfrom moru import Sandbox\n\n# Create a sandbox using the 'base' template (default)\nsandbox = Sandbox.create()\nprint(f\"Sandbox created: {sandbox.sandbox_id}\")\n\n# Run a command\nresult = sandbox.commands.run(\"echo 'Hello from Moru!'\")\nprint(f\"Output: {result.stdout}\")\n\n# Clean up\nsandbox.kill()\n```\n\n### Streaming Output\n\nStream stdout/stderr in real-time for long-running commands.\n\n**JavaScript / TypeScript:**\n\n```ts\nawait sandbox.commands.run(\"for i in 1 2 3; do echo $i; sleep 1; done\", {\n  onStdout: (data) =\u003e console.log(data),\n  onStderr: (data) =\u003e console.error(data),\n})\n```\n\n**Python:**\n\n```python\nsandbox.commands.run(\n    \"for i in 1 2 3; do echo $i; sleep 1; done\",\n    on_stdout=lambda data: print(data),\n    on_stderr=lambda data: print(data),\n)\n```\n\n### Monitor Sandbox Logs\n\nAfter running your sandbox, you can view logs, monitor activity, and debug issues from the [Sandboxes tab](https://moru.io/dashboard?tab=sandboxes) in your dashboard.\n\n## Using a Custom Template\n\nWith custom templates, you can build your own VM snapshot with your own agent pre-installed. See the [Maru agent example](https://github.com/moru-ai/maru/tree/main/apps/agent) and the [templates documentation](https://moru.io/docs/templates/overview) for more information.\n\n```python\n# Python\nsandbox = Sandbox.create(\"my-template\")\n```\n\n```ts\n// JavaScript\nconst sandbox = await Sandbox.create('my-template')\n```\n\n## How It Works\n\nEach VM is a snapshot of a Docker build. You define a Dockerfile, CPU, and memory limits—Moru runs the build inside a Firecracker VM, then pauses and saves the exact state: CPU, dirty memory pages, and changed filesystem blocks.\n\nWhen you spawn a new VM, it resumes from that template snapshot. Memory snapshots are lazy-loaded via userfaultfd, which helps sandboxes start within a second.\n\nEach VM runs on Firecracker with KVM isolation and a dedicated kernel. Network uses namespaces for isolation and iptables for access control.\n\n## Documentation\n\nFor more information, visit [moru.io/docs](https://moru.io/docs).\n\n## Related\n\n- [Maru](https://github.com/moru-ai/maru) - A research assistant using Claude Agent SDK and Moru\n- [Sandbox Infrastructure](https://github.com/moru-ai/sandbox-infra) - Self-host the Firecracker runtime\n\n## Acknowledgement\n\nMoru started as a fork of [E2B](https://github.com/e2b-dev/E2B), and most of the low-level Firecracker runtime is still from upstream.\n\n## License\n\nSee [LICENSE](LICENSE) file.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmoru-ai%2Fmoru","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmoru-ai%2Fmoru","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmoru-ai%2Fmoru/lists"}