{"id":51377210,"url":"https://github.com/cdskill/qalma","last_synced_at":"2026-07-05T21:00:33.541Z","repository":{"id":362572690,"uuid":"1258733426","full_name":"cdskill/qalma","owner":"cdskill","description":"Angular-first, headless rich text editor toolkit built on ProseMirror — lightweight, signals-based, MIT.","archived":false,"fork":false,"pushed_at":"2026-06-28T14:48:42.000Z","size":1495,"stargazers_count":4,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-28T16:19:00.904Z","etag":null,"topics":["angular","contenteditable","editor","headless","prosemirror","rich-text-editor","signals","typescript","wysiwyg"],"latest_commit_sha":null,"homepage":"https://qalma.dev","language":"TypeScript","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/cdskill.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":".github/CODEOWNERS","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":"2026-06-03T21:40:05.000Z","updated_at":"2026-06-27T10:53:41.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/cdskill/qalma","commit_stats":null,"previous_names":["cdskill/angular-rte","cdskill/qalma"],"tags_count":20,"template":false,"template_full_name":null,"purl":"pkg:github/cdskill/qalma","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cdskill%2Fqalma","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cdskill%2Fqalma/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cdskill%2Fqalma/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cdskill%2Fqalma/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cdskill","download_url":"https://codeload.github.com/cdskill/qalma/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cdskill%2Fqalma/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35168795,"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-05T02:00:06.290Z","response_time":100,"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":["angular","contenteditable","editor","headless","prosemirror","rich-text-editor","signals","typescript","wysiwyg"],"created_at":"2026-07-03T14:00:27.945Z","updated_at":"2026-07-05T21:00:33.536Z","avatar_url":"https://github.com/cdskill.png","language":"TypeScript","funding_links":[],"categories":["Third Party Components"],"sub_categories":["Editors"],"readme":"\u003cp align=\"center\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/cdskill/qalma/main/apps/docs/public/qalma-mark-dark.svg\" /\u003e\n    \u003cimg src=\"https://raw.githubusercontent.com/cdskill/qalma/main/apps/docs/public/qalma-mark-light.svg\" alt=\"Qalma\" width=\"72\" height=\"72\" /\u003e\n  \u003c/picture\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eQalma\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  Angular-first, headless rich text editor toolkit built on \u003ca href=\"https://prosemirror.net/\"\u003eProseMirror\u003c/a\u003e.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.npmjs.com/package/@qalma/editor\"\u003e\u003cimg alt=\"npm version\" src=\"https://img.shields.io/npm/v/@qalma/editor?color=d9a45b\u0026label=%40qalma%2Feditor\u0026logo=npm\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/@qalma/editor\"\u003e\u003cimg alt=\"npm downloads\" src=\"https://img.shields.io/npm/dm/@qalma/editor?color=d9a45b\u0026logo=npm\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://packagephobia.com/result?p=@qalma/editor\"\u003e\u003cimg alt=\"install size\" src=\"https://packagephobia.com/badge?p=@qalma/editor\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/@qalma/editor\"\u003e\u003cimg alt=\"license\" src=\"https://img.shields.io/npm/l/@qalma/editor?color=d9a45b\" /\u003e\u003c/a\u003e\n  \u003cbr /\u003e\n  \u003cimg alt=\"Angular\" src=\"https://img.shields.io/badge/Angular-%E2%89%A521-dd0031?logo=angular\u0026logoColor=white\" /\u003e\n  \u003cimg alt=\"Built on ProseMirror\" src=\"https://img.shields.io/badge/built%20on-ProseMirror-6c5ce7\" /\u003e\n  \u003cimg alt=\"Types included\" src=\"https://img.shields.io/badge/types-included-3178c6?logo=typescript\u0026logoColor=white\" /\u003e\n  \u003ca href=\"https://github.com/cdskill/qalma/actions/workflows/deploy.yml\"\u003e\u003cimg alt=\"Deploy\" src=\"https://img.shields.io/github/actions/workflow/status/cdskill/qalma/deploy.yml?branch=main\u0026label=docs\u0026logo=github\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://qalma.dev/\"\u003eDocumentation\u003c/a\u003e\n  ·\n  \u003ca href=\"https://www.npmjs.com/package/@qalma/editor\"\u003enpm\u003c/a\u003e\n  ·\n  \u003ca href=\"https://github.com/cdskill/qalma/issues\"\u003eIssues\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n\u003e **Status:** alpha (`0.0.x`). The public API may still change between releases.\n\nQalma gives you a typed editor controller, signal-based state, and a small set\nof unstyled Angular primitives (`\u003cqalma-editor\u003e`, `\u003cqalma-content\u003e`,\n`\u003cqalma-toolbar\u003e`, `qalmaCommand`). Everything else — toolbar UI, styling,\nmenus, popovers — stays in your app. You choose the plugins, you own the markup.\n\n## Why Qalma\n\n- **Angular-native** — standalone components, signal-based state, `OnPush`, and\n  typed contracts instead of leaked ProseMirror internals.\n- **Headless** — no baked-in toolbar, theme, or feature set. The library ships\n  behavior; your app owns every pixel.\n- **Plugin-based** — compose schema nodes/marks, commands, shortcuts, and\n  ProseMirror plugins through `QalmaPlugin`s and ready-made kits.\n- **ProseMirror under the hood** — a battle-tested document engine, kept\n  internal until an API is deliberately designed.\n\n## Quick start\n\n```sh\nnpm install @qalma/editor\n```\n\n`@angular/core` `\u003e=21 \u003c22` is a peer dependency.\n\n```ts\nimport { createQalmaEditor, HistoryPlugin, TextFormattingKit } from '@qalma/editor';\n\nconst editor = createQalmaEditor({\n  content: '\u003cp\u003eHello world\u003c/p\u003e',\n  plugins: [\n    ...TextFormattingKit,\n    HistoryPlugin.configure({ depth: 200, newGroupDelay: 750 }),\n  ],\n});\n```\n\n```html\n\u003cqalma-editor [editor]=\"editor\"\u003e\n  \u003cqalma-toolbar\u003e\n    \u003cbutton qalmaCommand=\"toggleBold\"\u003eBold\u003c/button\u003e\n    \u003cbutton qalmaCommand=\"undo\"\u003eUndo\u003c/button\u003e\n    \u003cbutton qalmaCommand=\"redo\"\u003eRedo\u003c/button\u003e\n  \u003c/qalma-toolbar\u003e\n\n  \u003cqalma-content /\u003e\n\u003c/qalma-editor\u003e\n```\n\nSee the [`@qalma/editor` README](libs/editor/README.md) for the full controller\nAPI, components, and the list of available plugins.\n\n## Repository layout\n\nThis is an [Nx](https://nx.dev) monorepo.\n\n| Path           | Description                                                          |\n| -------------- | ------------------------------------------------------------------- |\n| `libs/editor`  | `@qalma/editor` — the published, headless editor toolkit.           |\n| `apps/sandbox` | A real consumer app and executable documentation of the public API. |\n| `apps/docs`    | The documentation site published to [qalma.dev](https://qalma.dev/). |\n| `infra`        | Infrastructure (S3 + CloudFront) for the docs site.                 |\n\n## Development\n\nRequires [pnpm](https://pnpm.io/) (`pnpm@10`).\n\n```sh\npnpm install\n\npnpm nx serve sandbox      # run the sandbox consumer app\npnpm nx serve docs         # run the documentation site\npnpm nx run-many -t lint   # lint everything\npnpm nx test editor        # Vitest contract tests for @qalma/editor\npnpm nx test sandbox       # Vitest consumer tests for the sandbox app\npnpm nx e2e sandbox-e2e    # Playwright browser coverage for the sandbox\npnpm nx build sandbox      # production bundle\n```\n\nRun `pnpm nx graph` to explore the project graph.\n\nPRs that modify tests, E2E specs, snapshots, test configs, CI workflows, or\nthe test-change guard need the `approved-test-change` label. The label is meant\nto force human review before a regression is accepted by weakening the tests.\n\n## Agent skills\n\nQalma ships an experimental agent skill pack in [`plugins/qalma`](plugins/qalma)\nfor Codex, Claude Code, and other agents that can consume `SKILL.md` folders. It\nteaches agents how to integrate `@qalma/editor`, compose headless Angular UI,\nauthor Qalma plugins, and debug common editor issues. The same skill source backs\nthe npm installer.\n\nInstall the skill pack in a project from npm:\n\n```sh\nnpx @qalma/skills add\n```\n\nThe npm CLI writes to `./.agents/skills/qalma` by default. It can also target\ntool-specific locations:\n\n```sh\nnpx @qalma/skills add --target claude\nnpx @qalma/skills add --target codex\n```\n\nThe `codex` target writes to `./.agents/skills/qalma`, the same project-local\nskills directory Codex scans by default.\n\n## Contributing\n\nIssues and pull requests are welcome. Please read [AGENTS.md](AGENTS.md) for the\narchitectural invariants and working agreement before opening a PR.\n\n## License\n\nMIT © Qalma\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcdskill%2Fqalma","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcdskill%2Fqalma","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcdskill%2Fqalma/lists"}