{"id":15014281,"url":"https://github.com/atmosphere/atmosphere","last_synced_at":"2026-04-01T20:03:16.642Z","repository":{"id":41398000,"uuid":"749137","full_name":"Atmosphere/atmosphere","owner":"Atmosphere","description":"The transport-agnostic real-time framework for the JVM. WebSocket, SSE, Long-Polling, gRPC, MCP — one API, any transport.","archived":false,"fork":false,"pushed_at":"2026-03-27T03:19:22.000Z","size":174808,"stargazers_count":3745,"open_issues_count":46,"forks_count":755,"subscribers_count":230,"default_branch":"main","last_synced_at":"2026-03-27T07:46:42.424Z","etag":null,"topics":["agentic-ai","event-driven","java","mcp","quarkus","spring-boot","sse","streaming","websocket"],"latest_commit_sha":null,"homepage":"https://async-io.org/","language":"Java","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/Atmosphere.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"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":["atmosphere"]}},"created_at":"2010-06-30T14:26:23.000Z","updated_at":"2026-03-27T03:19:26.000Z","dependencies_parsed_at":"2024-02-06T10:50:56.832Z","dependency_job_id":"ec1184b9-e401-4fbf-a13a-54cdce1c45f3","html_url":"https://github.com/Atmosphere/atmosphere","commit_stats":{"total_commits":5785,"total_committers":175,"mean_commits":33.05714285714286,"dds":"0.12411408815903202","last_synced_commit":"d867b1cc88b75a21362183664b1a1143abf3fd67"},"previous_names":[],"tags_count":292,"template":false,"template_full_name":null,"purl":"pkg:github/Atmosphere/atmosphere","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Atmosphere%2Fatmosphere","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Atmosphere%2Fatmosphere/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Atmosphere%2Fatmosphere/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Atmosphere%2Fatmosphere/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Atmosphere","download_url":"https://codeload.github.com/Atmosphere/atmosphere/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Atmosphere%2Fatmosphere/sbom","scorecard":{"id":17380,"data":{"date":"2025-08-11","repo":{"name":"github.com/Atmosphere/atmosphere","commit":"a6aef78171d49b1eb42a4c2d3bc89df7cefa532a"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.7,"checks":[{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":2,"reason":"Found 6/25 approved changesets -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"1 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/codeql-analysis.yml:1","Warn: no topLevel permission defined: .github/workflows/maven.yml:1","Warn: no topLevel permission defined: .github/workflows/mavenpublish.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/Atmosphere/atmosphere/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/Atmosphere/atmosphere/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:48: update your workflow using https://app.stepsecurity.io/secureworkflow/Atmosphere/atmosphere/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:62: update your workflow using https://app.stepsecurity.io/secureworkflow/Atmosphere/atmosphere/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/maven.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/Atmosphere/atmosphere/maven.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/maven.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/Atmosphere/atmosphere/maven.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/mavenpublish.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/Atmosphere/atmosphere/mavenpublish.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/mavenpublish.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/Atmosphere/atmosphere/mavenpublish.yml/main?enable=pin","Info:   0 out of   8 GitHub-owned GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: license/LICENSE-2.0.txt:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":7,"reason":"SAST tool detected but not run on all commits","details":["Info: SAST configuration detected: CodeQL","Warn: 0 commits out of 11 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-14T16:05:28.739Z","repository_id":41398000,"created_at":"2025-08-14T16:05:28.739Z","updated_at":"2025-08-14T16:05:28.739Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31291354,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T13:12:26.723Z","status":"ssl_error","status_checked_at":"2026-04-01T13:12:25.102Z","response_time":53,"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":["agentic-ai","event-driven","java","mcp","quarkus","spring-boot","sse","streaming","websocket"],"created_at":"2024-09-24T19:45:24.822Z","updated_at":"2026-04-01T20:03:16.631Z","avatar_url":"https://github.com/Atmosphere.png","language":"Java","readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"logo.png\" alt=\"Atmosphere\" width=\"120\"/\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eAtmosphere\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eReal-time transport layer for Java AI agents.\u003c/strong\u003e\u003cbr/\u003e\n  Build once with \u003ccode\u003e@Agent\u003c/code\u003e — deliver over WebTransport/HTTP3, WebSocket, SSE, gRPC, MCP, A2A, AG-UI, or any transport. Works with Spring AI, LangChain4j, Google ADK, Embabel, JetBrains Koog, or the built-in OpenAI-compatible client.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://central.sonatype.com/artifact/org.atmosphere/atmosphere-runtime\"\u003e\u003cimg src=\"https://img.shields.io/maven-central/v/org.atmosphere/atmosphere-runtime?label=Maven%20Central\u0026color=blue\" alt=\"Maven Central\"/\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/atmosphere.js\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/atmosphere.js?label=atmosphere.js\u0026color=blue\" alt=\"npm\"/\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/Atmosphere/atmosphere/actions/workflows/atmosphere-4x-ci.yml\"\u003e\u003cimg src=\"https://github.com/Atmosphere/atmosphere/actions/workflows/atmosphere-4x-ci.yml/badge.svg?branch=main\" alt=\"Atmosphere CI\"/\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/Atmosphere/atmosphere/actions/workflows/atmosphere-e2e.yml\"\u003e\u003cimg src=\"https://github.com/Atmosphere/atmosphere/actions/workflows/atmosphere-e2e.yml/badge.svg?branch=main\" alt=\"E2E Tests\"/\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/Atmosphere/atmosphere/actions/workflows/atmosphere-js-ci.yml\"\u003e\u003cimg src=\"https://github.com/Atmosphere/atmosphere/actions/workflows/atmosphere-js-ci.yml/badge.svg?branch=main\" alt=\"Atmosphere.js CI\"/\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\nAtmosphere is a transport-agnostic runtime for Java. Your application code declares **what** it does — the framework handles **how** it's delivered. A single `@Agent` class can serve browsers over WebSocket, expose tools via MCP, accept tasks from other agents via A2A, stream state to frontends via AG-UI, and route messages to Slack, Telegram, or Discord — all without changing a line of code.\n\n## Quick Start\n\n```bash\nbrew install Atmosphere/tap/atmosphere\n\n# or\n\ncurl -fsSL https://raw.githubusercontent.com/Atmosphere/atmosphere/main/cli/install.sh | sh\n\n# Run a built-in agent sample\natmosphere run spring-boot-multi-agent-startup-team\n\n# Or scaffold your own project from a sample\natmosphere new my-agent --template ai-chat\n\n# Import a skill from GitHub and run it\natmosphere import https://github.com/anthropics/skills/blob/main/skills/frontend-design/SKILL.md\ncd frontend-design \u0026\u0026 LLM_API_KEY=your-key ./mvnw spring-boot:run\n```\n\n## `@Agent`\n\nOne annotation. The framework wires everything based on what's in the class and what's on the classpath.\n\n```java\n@Agent(name = \"my-agent\", description = \"What this agent does\")\npublic class MyAgent {\n\n    @Prompt\n    public void onMessage(String message, StreamingSession session) {\n        session.stream(message);  // LLM streaming via configured backend\n    }\n\n    @Command(value = \"/status\", description = \"Show status\")\n    public String status() {\n        return \"All systems operational\";  // Executes instantly, no LLM cost\n    }\n\n    @Command(value = \"/reset\", description = \"Reset data\",\n             confirm = \"This will delete all data. Are you sure?\")\n    public String reset() {\n        return dataService.resetAll();  // Requires user confirmation first\n    }\n\n    @AiTool(name = \"lookup\", description = \"Look up data\")\n    public String lookup(@Param(\"query\") String query) {\n        return dataService.find(query);  // Callable by the LLM during inference\n    }\n}\n```\n\nWhat this registers depends on which modules are on the classpath:\n\n| Module on classpath | What gets registered |\n|---|---|\n| `atmosphere-agent` (required) | WebSocket endpoint at `/atmosphere/agent/my-agent` with streaming AI, conversation memory, `/help` auto-generation |\n| `atmosphere-mcp` | MCP endpoint at `/atmosphere/agent/my-agent/mcp` |\n| `atmosphere-a2a` | A2A endpoint at `/atmosphere/agent/my-agent/a2a` with Agent Card discovery |\n| `atmosphere-agui` | AG-UI endpoint at `/atmosphere/agent/my-agent/agui` |\n| `atmosphere-channels` + bot token | Same agent responds on Slack, Telegram, Discord, WhatsApp, Messenger |\n| (built-in) | Console UI at `/atmosphere/console/` |\n\n## Key Features\n\n**[Multi-Agent Orchestration](https://atmosphere.github.io/docs/agents/coordinator/)** — `@Coordinator` manages a fleet of agents with parallel fan-out, sequential pipelines, conditional routing, coordination journal, and result evaluation. Test with `StubAgentFleet` — no infrastructure needed.\n\n**[Agent Handoffs \u0026 Human-in-the-Loop](https://atmosphere.github.io/docs/reference/ai/)** — Transfer conversations between agents with `session.handoff()`. Pause tool execution with `@RequiresApproval` for human-in-the-loop approval — the virtual thread parks cheaply until the client approves or denies.\n\n**[6 AI Runtimes](https://atmosphere.github.io/docs/reference/ai/)** — Built-in, LangChain4j, Spring AI, Google ADK, Embabel, JetBrains Koog. Switch backends by changing one Maven dependency. All share tool calling, structured output, conversation memory, and usage tracking.\n\n**[3 Agent Protocols](https://atmosphere.github.io/docs/agents/a2a/)** — MCP (tools for Claude, Copilot, Cursor), A2A (agent-to-agent via JSON-RPC), AG-UI (streaming state to frontends). Auto-registered from classpath.\n\n**[6 Channels](https://atmosphere.github.io/docs/tutorial/23-channels/)** — Web, Slack, Telegram, Discord, WhatsApp, Messenger. Set a bot token and the same `@Command` + AI pipeline works everywhere.\n\n**[Skill Files](https://atmosphere.github.io/docs/agents/skills/)** — Markdown system prompts with sections for tools, guardrails, and channels. Auto-discovered from classpath. Browse curated skills in the [Atmosphere Skills](https://github.com/Atmosphere/atmosphere-skills) registry.\n\n**[Long-Term Memory](https://atmosphere.github.io/docs/agents/coordinator/)** — Agents remember users across sessions. `LongTermMemoryInterceptor` extracts facts via LLM and injects them into future system prompts. Three strategies: on session close, per message, or periodic.\n\n**[Conversation Memory](https://atmosphere.github.io/docs/reference/ai/)** — Pluggable compaction strategies (sliding window, LLM summarization). Durable sessions via SQLite or Redis survive server restarts.\n\n**[Eval Assertions](https://atmosphere.github.io/docs/reference/testing/)** — `LlmJudge` tests agent quality with `meetsIntent()`, `isGroundedIn()`, and `hasQuality()`. `StubAgentFleet` and `CoordinatorAssertions` for testing coordinators without infrastructure.\n\n**[15 Event Types](https://atmosphere.github.io/docs/reference/ai/)** — `AiEvent` sealed interface: text deltas, tool start/result/error, agent steps, handoffs, approval prompts, structured output, routing decisions. Normalized across all runtimes.\n\n**[5 Transports](https://atmosphere.github.io/docs/tutorial/04-transports/)** — WebTransport/HTTP3, WebSocket, SSE, Long-Polling, gRPC. Automatic fallback, reconnection, heartbeats, message caching. First Java framework with [WebTransport over HTTP/3](https://atmosphere.github.io/docs/webtransport/).\n\n**[Observability](https://atmosphere.github.io/docs/reference/observability/)** — OpenTelemetry tracing, Micrometer metrics, AI token usage tracking. Auto-configured with Spring Boot.\n\n## Client — atmosphere.js\n\n```bash\nnpm install atmosphere.js\n```\n\n```tsx\nimport { useStreaming } from 'atmosphere.js/react';\n\nfunction Chat() {\n  const { fullText, isStreaming, send } = useStreaming({\n    request: { url: '/atmosphere/agent/my-agent', transport: 'websocket' },\n  });\n  return \u003cp\u003e{fullText}\u003c/p\u003e;\n}\n```\n\nReact, [Vue](atmosphere.js/README.md#vue), [Svelte](atmosphere.js/README.md#svelte), and [React Native](atmosphere.js/README.md#react-native) bindings available. For Java/Kotlin clients, see [wAsync](https://github.com/Atmosphere/wasync) — async WebSocket, SSE, long-polling, and gRPC client.\n\n## Samples\n\n| Sample | Description |\n|--------|-------------|\n| [startup team](samples/spring-boot-multi-agent-startup-team/) | `@Coordinator` with 4 specialist agents |\n| [dentist agent](samples/spring-boot-dentist-agent/) | Commands, tools, skill file, Slack + Telegram |\n| [ai-tools](samples/spring-boot-ai-tools/) | Framework-agnostic tool calling + approval gates |\n| [orchestration-demo](samples/spring-boot-orchestration-demo/) | Agent handoffs and approval gates |\n| [mcp-server](samples/spring-boot-mcp-server/) | MCP tools, resources, prompts |\n| [rag-agent](samples/spring-boot-rag-chat/) | RAG with knowledge base search tools |\n| [durable-sessions](samples/spring-boot-durable-sessions/) | SQLite/Redis session persistence |\n\n[All 18 samples](samples/) \u0026middot; `atmosphere install` for interactive picker \u0026middot; [CLI reference](cli/README.md)\n\n## Getting Started\n\n```xml\n\u003c!-- Spring Boot 4.0 starter --\u003e\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.atmosphere\u003c/groupId\u003e\n    \u003cartifactId\u003eatmosphere-spring-boot-starter\u003c/artifactId\u003e\n    \u003cversion\u003e4.0.28\u003c/version\u003e\n\u003c/dependency\u003e\n\n\u003c!-- Agent module (required for @Agent, @Coordinator) --\u003e\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.atmosphere\u003c/groupId\u003e\n    \u003cartifactId\u003eatmosphere-agent\u003c/artifactId\u003e\n    \u003cversion\u003e4.0.28\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\nOptional: `atmosphere-ai`, `atmosphere-mcp`, `atmosphere-a2a`, `atmosphere-agui`, `atmosphere-channels`, `atmosphere-coordinator`. Add to classpath and features auto-register.\n\n**Requirements:** Java 21+ \u0026middot; Spring Boot 4.0+ or Quarkus 3.21+\n\n## Documentation\n\n[Tutorial](https://atmosphere.github.io/docs/tutorial/01-introduction/) \u0026middot; [Full docs](https://atmosphere.github.io/docs/) \u0026middot; [CLI](cli/README.md) \u0026middot; [Javadoc](https://atmosphere.github.io/apidocs/) \u0026middot; [Samples](samples/)\n\n## Support\n\nCommercial support and consulting available through [Async-IO.org](https://async-io.org).\n\n## Companion Projects\n\n| Project | Description |\n|---------|-------------|\n| [atmosphere-skills](https://github.com/Atmosphere/atmosphere-skills) | Curated agent skill files — personality, tools, guardrails |\n| [javaclaw-atmosphere](https://github.com/Atmosphere/javaclaw-atmosphere) | Atmosphere chat transport plugin for JavaClaw |\n\n## License\n\nApache 2.0 — @Copyright 2008-2026 [Async-IO.org](https://async-io.org)\n","funding_links":["https://github.com/sponsors/atmosphere"],"categories":["The latest additions 🎉"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fatmosphere%2Fatmosphere","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fatmosphere%2Fatmosphere","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fatmosphere%2Fatmosphere/lists"}