{"id":45217036,"url":"https://github.com/flyingrobots/git-cms","last_synced_at":"2026-02-20T17:13:13.996Z","repository":{"id":331957965,"uuid":"1128612803","full_name":"flyingrobots/git-cms","owner":"flyingrobots","description":"A serverless, Git-native CMS built on pure plumbing. Stores content as signed commit messages on empty trees—no database required, just immutable Merkle DAGs.","archived":false,"fork":false,"pushed_at":"2026-02-13T12:25:25.000Z","size":10896,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-13T21:30:32.290Z","etag":null,"topics":["auditability","blog","cms","cryptography","database","git","git-plumbing","git-stunts","gitops","ledger","provenance","serverless","signed-commits"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/flyingrobots.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-05T22:43:55.000Z","updated_at":"2026-02-12T00:43:28.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/flyingrobots/git-cms","commit_stats":null,"previous_names":["flyingrobots/git-cms"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/flyingrobots/git-cms","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flyingrobots%2Fgit-cms","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flyingrobots%2Fgit-cms/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flyingrobots%2Fgit-cms/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flyingrobots%2Fgit-cms/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/flyingrobots","download_url":"https://codeload.github.com/flyingrobots/git-cms/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flyingrobots%2Fgit-cms/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29658176,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-20T16:33:43.953Z","status":"ssl_error","status_checked_at":"2026-02-20T16:33:43.598Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":["auditability","blog","cms","cryptography","database","git","git-plumbing","git-stunts","gitops","ledger","provenance","serverless","signed-commits"],"created_at":"2026-02-20T17:13:13.872Z","updated_at":"2026-02-20T17:13:13.990Z","avatar_url":"https://github.com/flyingrobots.png","language":"JavaScript","readme":"# git-cms\n\n\u003cimg src=\"./docs/images/hero.png\" width=\"600\" alt=\"Burnt-Out Linux Penguin\" align=\"right\" /\u003e\n\nA serverless, database-free CMS built on Git plumbing.\n\n\u003e \"I'm using `git push` as my API endpoint.\"\n\n**git-cms** treats your Git repository as a distributed, cryptographically verifiable database. Instead of files, it stores content as commit messages on \"empty trees,\" creating a linear, append-only ledger for articles, comments, or any other structured data.\n\n## Quick Start (Docker - Safe!)\n\n### One-Time Setup\n\n```bash\n# Clone this repo\ngit clone https://github.com/flyingrobots/git-cms.git\ncd git-cms\n\n# Run setup (checks Docker + validates environment)\nnpm run setup\n```\n\n### Try It Out\n\n```bash\n# Option 1: Guided walkthrough of key features\nnpm run demo\n\n# Option 2: Interactive menu (start server, run tests, open shell)\nnpm run quickstart\n\n# Option 3: Just start the server\nnpm run dev\n# Open http://localhost:4638\n```\n\n**Everything runs in Docker - completely safe for your local Git setup.**\n\n## ⚠️ SAFETY WARNING\n\n**This project manipulates Git repositories at a low level. ALWAYS use Docker for testing.**\n\nThe tests create, destroy, and manipulate Git repositories. Running low-level plumbing commands on your host filesystem is risky - a typo could affect your local Git setup. That's why we built Docker isolation into everything.\n\n**Read more:** [TESTING_GUIDE.md](./TESTING_GUIDE.md) | [docs/GETTING_STARTED.md](./docs/GETTING_STARTED.md) | [docs/CONTENT_ID_POLICY.md](./docs/CONTENT_ID_POLICY.md)\n\n## Features\n\n- **Database-Free:** No SQL, No NoSQL. Just Git objects (Merkle DAG).\n- **Fast-Forward Only:** Enforces strict linear history for provenance.\n- **Atomic Publishes:** \"Publishing\" is just a pointer update (CAS).\n- **Infinite History:** Every draft save is a commit. Scrub back to any point in time.\n\n## Development\n\n### Start the Server (Dev Mode)\n```bash\nnpm run dev\n# OR\ndocker compose up app\n```\nThe API and Admin UI will be available at `http://localhost:4638`.\n\n### Run Tests\n```bash\nnpm test\n# OR\ndocker compose run --rm test\n```\n\n## Installation\n\n```bash\n# From source (recommended until npm publish):\ngit clone https://github.com/flyingrobots/git-cms.git\ncd git-cms\nnpm link\n\n# After publish, global install will work:\n# npm install -g git-cms\n```\n\n## Usage\n\n### 1. Initialize a \"Stargate\" (The Gateway)\n\nTo use `git-cms` securely, you should pair it with **[git-stargate](https://github.com/flyingrobots/git-stargate)**.\n\nStargate is a minimal, bash-based Git gateway that enforces:\n- **Fast-Forward Only:** No force pushes allowed.\n- **Signed Commits:** Every update must be cryptographically signed by an authorized key.\n- **Mirroring:** Validated updates are automatically mirrored to public repositories (like GitHub).\n\n```bash\n# Bootstrap a local stargate for testing\n./scripts/bootstrap-stargate.sh ~/git/_blog-stargate.git\n\n# Link it\ngit remote add stargate ~/git/_blog-stargate.git\ngit config remote.stargate.push \"+refs/_blog/*:refs/_blog/*\"\n```\n\n### 2. Encryption \u0026 Attachments\n\nAttachments are **encrypted client-side** (AES-256-GCM) before they are ever committed to the repository. \n\n- Keys are managed securely via your OS Keychain (macOS/Linux/Windows).\n- The \"Stargate\" receives only opaque, encrypted blobs.\n- This effectively gives you \"Row Level Security\" on a file system—only users with the key can decrypt the assets.\n\n### 3. Write a Draft\nContent is stored in `refs/_blog/articles/\u003cslug\u003e`.\n\n```bash\necho \"# Hello World\" | git cms draft hello-world \"My First Post\"\n```\n\n### 4. List Articles\n```bash\ngit cms list\n# -\u003e refs/_blog/articles/hello-world My First Post\n```\n\n### 5. Publish\nPublishing fast-forwards `refs/_blog/published/\u003cslug\u003e` to match the draft.\n\n```bash\ngit cms publish hello-world\n```\n\n## License\n\nCopyright © 2026 James Ross. This software is licensed under the [Apache License](./LICENSE), Version 2.0\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflyingrobots%2Fgit-cms","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fflyingrobots%2Fgit-cms","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflyingrobots%2Fgit-cms/lists"}