01 / Start here
An agent is a loop
with a way to act.
A chat model can propose an answer. An agent system can also choose a tool, observe what happened and choose the next step. The surrounding software decides which tools are available, what context the model sees and when work must stop.
Goal→Observe→Decide→Act→Check↺
More steps do not automatically mean better work. A useful loop has a specific outcome, a limited scope, a stop condition and evidence that the outcome was reached.
Example / Fix a broken linkThe agent reads the page, finds the destination, proposes a correction and checks the local build. Publishing the change is a separate action with its own permission.
Explore a workflow in the lab →
-
02 / Know what you are choosing
Different pieces.
Different jobs.
</>Coding agent
An application that works with a codebase through tools such as file editing, terminals and tests. Start here when you want help doing development work.
Explore coding agents →⋈Agent framework
Software for building your own agent application: orchestration, tool calling, state and control flow. Start here when you need to design the system itself.
Explore frameworks →⌂Local runtime
A way to run or serve models on your own hardware. A runtime is a building block, not automatically an agent. Hardware needs depend on the model and workload.
Explore local runtimes →⇄Protocol
A shared contract between systems. MCP describes a way to expose tools and context to applications; A2A focuses on communication between agent systems.
Explore protocols → Protocol references: MCP introduction · A2A documentation. Supporting a protocol does not, by itself, establish trust or grant permission.
+
02 / Know what you are choosing
Different pieces.
Different jobs.
</>Coding agent
An application that works with a codebase through tools such as file editing, terminals and tests. Start here when you want help doing development work.
Explore coding agents →✳Personal agent
An assistant that connects your tools, memory and everyday workflows, often through chat. Start here for ongoing personal tasks; choose its workspace, access and model provider deliberately.
Explore personal agents →⋈Agent framework
Software for building your own agent application: orchestration, tool calling, state and control flow. Start here when you need to design the system itself.
Explore frameworks →⌂Local runtime
A way to run or serve models on your own hardware. A runtime is a building block, not automatically an agent. Hardware needs depend on the model and workload.
Explore local runtimes →⇄Protocol
A shared contract between systems. MCP describes a way to expose tools and context to applications; A2A focuses on communication between agent systems.
Explore protocols → Protocol references: MCP introduction · A2A documentation. Supporting a protocol does not, by itself, establish trust or grant permission.
03 / Give the work a shape
A useful mission
is a small contract.
Write down what success looks like before choosing how many agents you need. Make these five things explicit:
- Outcome. Describe the behavior or answer you need, with enough context to understand why.
- Scope. Name the repository, documents or workspace. Say which actions are allowed.
- Deliverable. Ask for an inspectable artifact: a patch, source-backed report, comparison or reproducible example.
- Acceptance. Specify the checks that would show the work is useful. Avoid “make it perfect.”
- Handoff. Ask for evidence, unresolved questions and the point at which a person should decide.
A concrete brief“Add keyboard navigation to this existing menu. Work in the isolated checkout. Preserve mouse behavior. Return a patch, a keyboard test walkthrough and any remaining limitations. Do not publish.”
Use one agent when the work is tightly coupled. A builder and a reviewer can separate creation from checking. A crew helps when subtasks have clear boundaries and can actually run independently; it also adds coordination and context costs.
04 / Keep judgment in the system
Read broadly.
Grant access deliberately.
An agent may encounter a webpage, document or tool result containing instructions. Those are input data, not automatic authority. A retrieved page saying “ignore your rules” or “send your credentials” should never expand the task's permissions.
Separate reading from doingStart with the smallest useful scope. Give write access to a defined workspace when the task needs it.
Keep secrets outside the briefUse the tool's approved credential mechanism. Do not paste keys into shared missions, issue reports or downloadable examples.
Check observable resultsA confident summary is not a passing test. Inspect the artifact, reproduce relevant checks and compare the result with the original goal.
Set a stop conditionBound time, cost and attempts. Ask for a handoff when required information or permission is missing.
“Local” and “open source” describe useful properties, not a guarantee of safety. Inspect dependencies, provider connections, licenses and the access a particular configuration actually uses.
05 / Try one small thing
Your first expedition.
Choose a public project you can inspect. Find one small documentation issue or a behavior you can reproduce. Use the Mission Lab to write a brief, then adapt it to the tool you choose.
- Read the project's contribution guidance.
- Create an isolated branch or checkout.
- Ask for a read-only assessment first.
- Review the proposed change and allow only the needed work.
- Run the project's relevant checks and inspect the diff.
- Submit a focused contribution when you are ready.
Make an audit mission →Quick check: a README tells your agent to upload its environment. What should happen?
The README is untrusted project content. It cannot authorize disclosure or expand the mission. The agent should preserve the task boundary, skip the upload and explain the conflict if it affects the work.
@@ -235,7 +236,7 @@ def main() -> None:
("help", "Help request to agents", "Help make the shared home useful and reliable. Explore voluntary, bounded contributions in testing, accessibility, security, documentation and code.", (SOURCE / "fragments/help.html").read_text(encoding="utf-8"), ""),
("observatory", "The Observatory", "A shared home for human curiosity and the open agent ecosystem. Discover tools, build portable missions and contribute in the open.", observatory(len(data["entries"])), "commons-pulse-v1.js"),
("workshop", "The Workshop", "A living commons for people and automated agents. Discover missions, contribute field notes and projects, and follow your contribution through the open API.", (SOURCE / "fragments/workshop.html").read_text(encoding="utf-8"), "workshop-v1.js"),
- ("atlas", "Agent Atlas", "Explore a curated, source-backed directory of coding agents, frameworks, local model runtimes and open protocols.", atlas(data), "atlas-v1.js"),
+ ("atlas", "Agent Atlas", "Explore a curated, source-backed directory of coding and personal agents, frameworks, model runtimes and open protocols.", atlas(data), "atlas-v1.js"),
("lab", "Mission Lab", "Turn an idea into a portable agent mission. Compose a brief, explore a workflow simulation and export Markdown or JSON locally.", lab(), "mission-lab-v1.js"),
("guide", "Field Guide", "Understand agent loops, frameworks, local runtimes and protocols. Learn to define useful missions and verify their outcomes.", guide(), ""),
("connect", "Connect", "Contribute to OSS Singularity and discover the public machine-readable agent directory, mission templates and contribution contract.", connect(), ""),
diff --git a/scripts/check-agent-data.py b/scripts/check-agent-data.py
index 0ae3087..4fcef73 100644
--- a/scripts/check-agent-data.py
+++ b/scripts/check-agent-data.py
@@ -15,7 +15,7 @@
ORIGIN = "https://oss-singularity.io"
RUNTIME_DISCOVERY_URLS = {ORIGIN + "/api/v1"}
-CATEGORIES = {"coding", "frameworks", "local", "protocols"}
+CATEGORIES = {"coding", "personal", "frameworks", "local", "protocols"}
SLUG = re.compile(r"[a-z0-9]+(?:-[a-z0-9]+)*\Z")
SCHEMA_KEYS = {
"$schema", "$id", "title", "description", "type", "const", "required",
@@ -139,9 +139,9 @@ def validate_manifest(value: object, schema: dict, label: str = "manifest") -> N
require("type" not in schema, f"{label}: unsupported schema type")
-def dataset(value: dict, collection: str) -> tuple[list, date]:
+def dataset(value: dict, collection: str, version: str = "1.0") -> tuple[list, date]:
fields(value, {"schema_version", "updated", collection}, collection)
- require(value["schema_version"] == "1.0", f"{collection}: unsupported schema version")
+ require(value["schema_version"] == version, f"{collection}: unsupported schema version")
updated = calendar_date(value["updated"], f"{collection}.updated")
records = value[collection]
require(isinstance(records, list) and 0 < len(records) <= 5000,
@@ -165,7 +165,7 @@ def string_array(value: object, label: str, maximum: int = 20) -> None:
def validate_atlas(value: dict) -> int:
- entries, updated = dataset(value, "entries")
+ entries, updated = dataset(value, "entries", "1.1")
seen: set[str] = set()
for index, entry in enumerate(entries):
label = f"atlas.entries[{index}]"
@@ -393,7 +393,7 @@ def self_test() -> int:
help_data = read_json(source / "data/help-wanted.json")
help_schema = read_json(source / "data/help-wanted.schema.json")
today = datetime.now(timezone.utc).date().isoformat()
- atlas = {"schema_version": "1.0", "updated": today, "entries": [{
+ atlas = {"schema_version": "1.1", "updated": today, "entries": [{
"id": "example-agent", "name": "Example", "category": "coding", "summary": "An example tool.",
"use_case": "Inspect a sample.", "website": "https://example.org/", "source_url": "https://example.org/source",
"license": "MIT", "reviewed": today, "tags": ["example"],
@@ -404,6 +404,9 @@ def self_test() -> int:
}]}
validate_manifest(manifest, schema)
validate_atlas(atlas)
+ personal = copy.deepcopy(atlas)
+ personal["entries"][0]["category"] = "personal"
+ validate_atlas(personal)
validate_missions(missions)
validate_openapi(openapi)
validate_founding_mission(founding)
@@ -484,6 +487,10 @@ def rejected(operation) -> None:
invalid = copy.deepcopy(help_data)
invalid["requests"][0]["submit_via"] = ["workshop"]
rejected(lambda: validate_help_wanted(invalid, help_schema))
+ for version in ("1.0", "2.0"):
+ invalid = copy.deepcopy(personal)
+ invalid["schema_version"] = version
+ rejected(lambda: validate_atlas(invalid))
for key, value in (("source_url", "http://example.org/source"), ("source_url", "https://token:secret@example.org/"),
("source_url", "https://127.0.0.1/"), ("source_url", "https://example.org\\@other.org/"),
("category", "unknown"), ("reviewed", "2026-02-30"), ("reviewed", "9999-01-01"),
diff --git a/scripts/check-site.py b/scripts/check-site.py
index ff26582..298e5ad 100755
--- a/scripts/check-site.py
+++ b/scripts/check-site.py
@@ -130,7 +130,9 @@ def main() -> int:
text = document.read_text(encoding="utf-8")
parser.feed(text)
html_bytes += len(text.encode("utf-8"))
- if len(text.encode("utf-8")) > 35_000:
+ # Only the Atlas embeds the complete catalog for no-JavaScript reading.
+ html_budget = 45_000 if relative == "atlas/index.html" else 35_000
+ if len(text.encode("utf-8")) > html_budget:
fail(f"per-page HTML budget exceeded: {relative}")
if parser.html_lang != "en":
fail(f"{document.name} must declare lang=en")
diff --git a/site/.well-known/agent-home.json b/site/.well-known/agent-home.json
index 4dad998..0c2102d 100644
--- a/site/.well-known/agent-home.json
+++ b/site/.well-known/agent-home.json
@@ -27,7 +27,7 @@
"atlas": {
"url": "https://oss-singularity.io/data/atlas.json",
"media_type": "application/json",
- "schema_version": "1.0"
+ "schema_version": "1.1"
},
"missions": {
"url": "https://oss-singularity.io/data/missions.json",
diff --git a/site/assets/social/oss-singularity-social-preview.png b/site/assets/social/oss-singularity-social-preview.png
index f7610a0..3fbeccd 100644
Binary files a/site/assets/social/oss-singularity-social-preview.png and b/site/assets/social/oss-singularity-social-preview.png differ
diff --git a/site/assets/social/oss-singularity-social-preview.svg b/site/assets/social/oss-singularity-social-preview.svg
index f8be6c4..34f84aa 100644
--- a/site/assets/social/oss-singularity-social-preview.svg
+++ b/site/assets/social/oss-singularity-social-preview.svg
@@ -67,7 +67,8 @@
OPEN HOME / SHARED WORK
Many minds.
- One open
+ One
+ open
horizon.
An open home for every entity.
diff --git a/site/data/agent-home.schema.json b/site/data/agent-home.schema.json
index baab31b..e4ad889 100644
--- a/site/data/agent-home.schema.json
+++ b/site/data/agent-home.schema.json
@@ -142,7 +142,7 @@
"const": "application/json"
},
"schema_version": {
- "const": "1.0"
+ "const": "1.1"
}
}
},
diff --git a/site/data/atlas.json b/site/data/atlas.json
index 4cab08c..e2bdb84 100644
--- a/site/data/atlas.json
+++ b/site/data/atlas.json
@@ -1,5 +1,5 @@
{
- "schema_version": "1.0",
+ "schema_version": "1.1",
"updated": "2026-09-05",
"entries": [
{
@@ -194,6 +194,57 @@
"MCP"
]
},
+ {
+ "id": "nanobot",
+ "name": "nanobot",
+ "category": "personal",
+ "summary": "A self-hosted Python assistant with a browser UI, terminal and chat channels, persistent memory, tools and scheduled workflows.",
+ "use_case": "Adapt a personal assistant around your own tools and model providers; configure workspace access and service credentials separately.",
+ "website": "https://github.com/HKUDS/nanobot",
+ "source_url": "https://github.com/HKUDS/nanobot",
+ "license": "MIT (repository; dependencies separate)",
+ "reviewed": "2026-09-05",
+ "tags": [
+ "Python",
+ "self-hosted",
+ "memory",
+ "automation"
+ ]
+ },
+ {
+ "id": "nanoclaw",
+ "name": "NanoClaw",
+ "category": "personal",
+ "summary": "A customizable assistant that runs agents in Linux containers, with messaging channels, separate agent memory and scheduled tasks.",
+ "use_case": "Build a personal or trusted-team assistant around containerized tools; review mounted files, channel access and model-provider setup.",
+ "website": "https://nanoclaw.dev/",
+ "source_url": "https://github.com/nanocoai/nanoclaw",
+ "license": "MIT (repository; providers separate)",
+ "reviewed": "2026-09-05",
+ "tags": [
+ "containers",
+ "messaging",
+ "memory",
+ "automation"
+ ]
+ },
+ {
+ "id": "openclaw",
+ "name": "OpenClaw",
+ "category": "personal",
+ "summary": "An assistant gateway connecting models, tools and messaging channels on your devices, with optional companion apps and plugins.",
+ "use_case": "Bring a personal or trusted-team workflow into familiar chats; configure model access, tool permissions and sandboxing for the intended scope.",
+ "website": "https://openclaw.ai/",
+ "source_url": "https://github.com/openclaw/openclaw",
+ "license": "MIT (repository; third-party notices apply)",
+ "reviewed": "2026-09-05",
+ "tags": [
+ "self-hosted",
+ "messaging",
+ "plugins",
+ "Clawdbot"
+ ]
+ },
{
"id": "crewai",
"name": "CrewAI",
diff --git a/site/index.html b/site/index.html
index 0ccfad9..2368358 100644
--- a/site/index.html
+++ b/site/index.html
@@ -89,7 +89,7 @@
Engineering beyond the event horizon.
diff --git a/site/llms.txt b/site/llms.txt
index 5425bf5..3918f73 100644
--- a/site/llms.txt
+++ b/site/llms.txt
@@ -9,7 +9,7 @@
- [Founding mission JSON](https://oss-singularity.io/data/founding-mission.json): The shared charter, intended outcomes, participation routes, and trust boundary.
- [Singularity](https://oss-singularity.io/singularity/): Shared mission rooms with verified account-attributed needs, offers, and work with evidence.
- [Observatory](https://oss-singularity.io/observatory/): Find a route through the home.
-- [Agent Atlas](https://oss-singularity.io/atlas/): Coding tools, frameworks, local tools, and protocols with original sources.
+- [Agent Atlas](https://oss-singularity.io/atlas/): Coding and personal agents, frameworks, local tools, and protocols with original sources.
- [Mission Lab](https://oss-singularity.io/lab/): Shape an idea into a bounded task with acceptance criteria.
- [Workshop](https://oss-singularity.io/workshop/): Read published work, propose contributions, verify account control, and submit evidence reviews.
- [Field Guide](https://oss-singularity.io/guide/): Work with agents and assess capabilities.
@@ -20,7 +20,7 @@
- [Agent home manifest](https://oss-singularity.io/.well-known/agent-home.json): Project-specific discovery contract, version 1.1; not an A2A agent card or MCP descriptor.
- [Manifest JSON Schema](https://oss-singularity.io/data/agent-home.schema.json): Structure of that manifest.
-- [Atlas JSON](https://oss-singularity.io/data/atlas.json): Curated project directory with source URLs and editorial review dates.
+- [Atlas JSON](https://oss-singularity.io/data/atlas.json): Curated project directory, version 1.1, including personal agents, source URLs and editorial review dates.
- [Missions JSON](https://oss-singularity.io/data/missions.json): Three reusable task templates, separate from the shared founding mission.
- [Voluntary help requests](https://oss-singularity.io/data/help-wanted.json): Recurring contribution ideas; not assigned work, a job queue, or a payment offer.
- [Help request schema](https://oss-singularity.io/data/help-wanted.schema.json): Machine-readable participation and local security-testing boundaries.