{"id":51228250,"url":"https://github.com/camalot/cliff-notes","last_synced_at":"2026-06-28T13:30:54.632Z","repository":{"id":362598303,"uuid":"1248090864","full_name":"camalot/cliff-notes","owner":"camalot","description":"Interactive playground for git-cliff configurations.","archived":false,"fork":false,"pushed_at":"2026-06-19T04:15:08.000Z","size":4960,"stargazers_count":0,"open_issues_count":7,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-22T21:32:45.544Z","etag":null,"topics":["changelog-generator","git-cliff","playground","release-notes"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/camalot.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"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":null,"dco":null,"cla":null},"funding":{"github":"camalot","patreon":"darthminos","custom":["https://paypal.me/camalotdesigns/10","https://www.twitch.tv/products/darthminos"]}},"created_at":"2026-05-24T07:11:48.000Z","updated_at":"2026-06-08T23:00:26.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/camalot/cliff-notes","commit_stats":null,"previous_names":["camalot/cliff-notes"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/camalot/cliff-notes","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/camalot%2Fcliff-notes","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/camalot%2Fcliff-notes/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/camalot%2Fcliff-notes/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/camalot%2Fcliff-notes/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/camalot","download_url":"https://codeload.github.com/camalot/cliff-notes/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/camalot%2Fcliff-notes/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34890795,"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-06-28T02:00:05.809Z","response_time":54,"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":["changelog-generator","git-cliff","playground","release-notes"],"created_at":"2026-06-28T13:30:54.502Z","updated_at":"2026-06-28T13:30:54.619Z","avatar_url":"https://github.com/camalot.png","language":"TypeScript","funding_links":["https://github.com/sponsors/camalot","https://patreon.com/darthminos","https://paypal.me/camalotdesigns/10","https://www.twitch.tv/products/darthminos"],"categories":[],"sub_categories":[],"readme":"# cliff-notes\n\nInteractive playground for [git-cliff](https://git-cliff.org) configurations. Edit a `cliff.toml`, supply or load tags and commits, and render the resulting changelog markdown — all in a browser, against a real `git-cliff` binary on the server.\n\n## Stack\n\n- **Web:** Vite + React + TypeScript + Tailwind + shadcn/ui + Monaco\n- **API:** Node 20+ + TypeScript + Fastify, shells out to `git-cliff` and `git`\n- **Shared:** Zod schemas reused by both sides\n- **Language:** Language definition\n- **Tests:** Vitest (web + api) with lcov + JUnit XML reporters; Playwright for E2E\n- **Container:** single multi-stage Dockerfile, API serves the SPA from one port\n\n## Layout\n\n```tree\napps/\n  api/        Fastify backend\n  web/        Vite + React frontend\npackages/\n  shared/     Zod schemas, types, random conventional commit generator\ntests/\n  e2e/        Playwright suite\n```\n\n## Prerequisites\n\n- Node 20+\n- pnpm 9+ (`corepack enable \u0026\u0026 corepack prepare pnpm@9.15.0 --activate`)\n- `git` and `git-cliff` binaries on PATH for the API to run end-to-end\n\nThe included devcontainer already provides all three.\n\n## Development\n\n```sh\npnpm install\npnpm dev              # runs web + api in parallel\n```\n\n- Web: http://localhost:5173\n- API: http://localhost:3001\n\n## Testing\n\n```sh\npnpm typecheck\npnpm test             # unit + integration\npnpm test:coverage    # lcov reports under coverage/\npnpm test:junit       # JUnit XML reports under reports/\npnpm test:e2e         # Playwright (requires services running, or use playwright webServer)\n```\n\n## Production container\n\n```sh\ndocker build -t cliff-notes .\ndocker run --rm -p 3001:3001 cliff-notes\n# open http://localhost:3001\n```\n\n## Endpoints\n\n| Method | Path                  | Purpose                                                                 |\n| ------ | --------------------- | ----------------------------------------------------------------------- |\n| POST   | `/api/render`         | `{ cliffToml, tags, commits }` → rendered changelog markdown.           |\n| POST   | `/api/repo/inspect`   | `{ url, range? }` → tags, commits, and (if present) `cliff.toml`.       |\n| POST   | `/api/commits/random` | `{ type, breaking?, count? }` → synthesized conventional commits.       |\n| GET    | `/api/health`         | Liveness probe.                                                         |\n| GET    | `/api/healthz`        | Liveness probe.                                                         |\n| GET    | `/api/ready`          | Readiness probe.                                                        |\n\nAllowed clone hosts: `github.com`, `gitlab.com`, `bitbucket.org`, `codeberg.org`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcamalot%2Fcliff-notes","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcamalot%2Fcliff-notes","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcamalot%2Fcliff-notes/lists"}