OpenMorph Specification v0.1.0
Status: Canonical — locked Feb 20, 2026. No schema changes without a version bump. Scope: This document defines the
.morph/directory format. It is the source of truth for all implementation work in OpenMorph (V1.0 Layer 3).
Table of Contents
- Concept
- Directory Structure
- File Schemas
- Git Conventions
- Sync Modes
- Nested Spaces
- Migration Guide (V0.9 → V1.0)
- Versioning Policy
- Open Questions
1. Concept
.morph/ is to AI augmentation what .git/ is to version control.
Drop a .morph/ directory into any folder and it becomes a Morph Space — an AI-augmented context with its own tasks, memory, conversations, skills, and canvas. The directory is:
- Human-readable — plain Markdown and YAML, editable with any text editor
- Portable — copy it to another machine, share it via git, check it into a repo
- Version-controlled — every write is a git commit; branch and time-travel as first-class operations
- Tool-agnostic — any tool that reads Markdown/YAML can integrate with
.morph/ - Offline-first — git is local; the Morphee backend is a sync hub, not a dependency
Breaking change notice: V1.0 migrates ALL existing Spaces to
.morph/format. PostgreSQL becomes identity + read cache only. No backward compatibility with V0.9 data format.
2. Directory Structure
any-directory/ # User's project or folder ("outside world")
├── .morph/ # ← Presence signals a Morph Space (the repo root)
│ │
│ │ ── Root files (owned by core, shared with all integrations) ──────────
│ ├── config.yaml # REQUIRED: Space identity + integration config
│ ├── acl.yaml # OPTIONAL: Access control (who reads/writes what)
│ ├── canvas.yaml # REQUIRED: Canvas layout state
│ │
│ │ ── Credential vault ────────────────────────────────────────────────
│ └── vault/
│ ├── com.google.calendar.enc # One encrypted file per integration
│ └── net.atlassian.jira.enc
│
│ │ ── Core integrations (built-in, created on first write) ────────────
│ ├── core.tasks/
│ │ ├── manifest.yaml # Integration identity + capabilities
│ │ └── task-{uuid}.md # One file per task
│ ├── core.conversations/
│ │ ├── manifest.yaml
│ │ └── conv-{uuid}.md
│ ├── core.memory/
│ │ ├── manifest.yaml
│ │ ├── facts/{uuid}.md
│ │ ├── preferences/{uuid}.md
│ │ ├── events/{uuid}.md
│ │ └── notes/{uuid}.md
│ ├── core.skills/
│ │ ├── manifest.yaml
│ │ └── {skill-slug}.yaml
│ ├── core.scheduler/
│ │ ├── manifest.yaml
│ │ └── {schedule-slug}.yaml
│ └── core.canvas/
│ └── manifest.yaml
│
│ │ ── Third-party integrations (created by WASM extensions) ───────────
│ ├── net.atlassian.jira/
│ │ ├── manifest.yaml # Format, version, capabilities declared
│ │ ├── issues/
│ │ │ └── PROJ-123.yaml
│ │ └── sync-state.yaml
│ ├── com.google.calendar/
│ │ ├── manifest.yaml
│ │ └── events/
│ └── io.github.alice.my-extension/ # Community extensions
│ └── manifest.yaml
│
├── src/ # User's own files — "outside world"
└── README.md # Outside world — ACL-gated access
Directory naming conventions:
core.*— built-in Morphee integrations. Registered and maintained by Morphee.ai.com.*,net.*,org.*— third-party integrations using reverse-domain notation.io.github.{user}.{name}— community / open-source extensions.- Morphee.ai acts as the protocol authority for namespace registration (analogous to IANA).
The .morph/ root is the shared space. All integrations with root access (morph_root_access = True) can read root files (config.yaml, acl.yaml, canvas.yaml). Each integration is otherwise sandboxed to its own subdirectory.
The "outside world" is the parent folder of .morph/ (e.g. src/, README.md). Integrations may declare outside_world: true in their capabilities to request access. Access is governed by acl.yaml and not yet enforced (V1.2+).
manifest.yaml is required in every integration directory. Written automatically on first write via BaseInterface.morph_write(). Declares identity, version, and capabilities.
Rules:
.morph/config.yamlis the only truly required file — its presence defines a Space.- Integration directories are created on first write (not upfront).
- Files use UUID-based names for system entities and slug-based names for user-defined entities.
- No binary files. Ever.