{"id":21365469,"url":"https://github.com/frameable/junco-cms","last_synced_at":"2025-08-16T07:04:37.063Z","repository":{"id":53519501,"uuid":"418554420","full_name":"frameable/junco-cms","owner":"frameable","description":"Minimal git-based CMS in Node.js","archived":false,"fork":false,"pushed_at":"2023-03-06T04:04:43.000Z","size":675,"stargazers_count":10,"open_issues_count":0,"forks_count":0,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-04-07T05:42:48.876Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/frameable.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}},"created_at":"2021-10-18T15:10:16.000Z","updated_at":"2024-10-17T05:20:56.000Z","dependencies_parsed_at":"2022-08-29T11:51:42.899Z","dependency_job_id":null,"html_url":"https://github.com/frameable/junco-cms","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/frameable/junco-cms","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frameable%2Fjunco-cms","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frameable%2Fjunco-cms/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frameable%2Fjunco-cms/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frameable%2Fjunco-cms/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/frameable","download_url":"https://codeload.github.com/frameable/junco-cms/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frameable%2Fjunco-cms/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270679279,"owners_count":24626932,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-16T02:00:11.002Z","response_time":91,"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":[],"created_at":"2024-11-22T07:11:20.819Z","updated_at":"2025-08-16T07:04:37.018Z","avatar_url":"https://github.com/frameable.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Junco\n\nMinimal git-based CMS in Node.js\n\n### Features\n\n- All data and content is stored entirely in a git repository\n- Pages in markdown format\n- Page metadata support via front matter\n- User authentication backends: LDAP, OAuth, local\n- REST API for reading content in multiple formats\n- Browse revision history and restore from pervious versions\n- Very few moving parts so it is hard to break\n\n### Introduction\n\nAt its core, Junco is essentially a web interface for editing markdown files in a dedicated [git](https://git-scm.com/) repository.  There is basic support for uploading media files so that you can refer to images and videos in page content.  Junco is \"headless\" -- it is a repository for editing and storing your content.  In order to display content to end-users, you will most likely retrieve content via Junco's REST API and render it in your own front end.  Stored content is available as raw markdown text, structured markdown AST, or hierarchical rendered HTML.\n\nWhen content is saved, it is checked into the local git repository, and changes are periodically pushed to the configured origin.  For a high-availability setup, production read-only nodes can pull periodically from origin, and an internal read-write node can be available to creators/editors. \n\nJunco was originally forked from [jingo](https://github.com/claudioc/jingo)\n\n### Getting started\n\nConfigure a git repo where youre content will live:\n\n```bash\nmkdir /var/tmp/content\ngit -C /var/tmp/content init\ngit -C /var/tmp/content remote add origin ...\n```\n\nSpecify the path to your repo in `config/default.json`:\n\n```\n  ...\n  \"remote\": \"origin\",\n  \"repository\": \"/var/tmp/content\",\n  ...\n```\n\nInstall dependencies:\n```bash\nnpm install\n```\n\nStart the application:\n```bash\nnpm start\n```\n\nThe default configuration is to allow for local logins with admin/admin as the credentials.  You should obviously change this in production settings.  Local passwords are SHA1, so you can generate them in config with `echo -n 'secret-password' | sha1sum` if you like.\n\n## REST API\n\nJunco exposes a basic API for listing and retrieving content.\n\n\n#### GET /api/pages\n\nList all pages, optionally filtered with a prefix-match.\n\n```bash\n$ curl localhost/api/pages?prefix=my-namespace:\n\n{\n  \"pages\":[\n    {\n      \"source\": \"Hello, World!\",\n      \"metadata\":{\n        \"name\":\"my-namespace:my-page\",\n        \"hash\":\"e965aaf\",\n        \"author\":\"admin\",\n        \"date\":\"Sun, 24 Oct 2021 15:27:03 -0400\",\n        \"relDate\":\"10m ago\",i\n        \"timestamp\":\"1635103623\"\n      },\n      \"attributes\":{}\n    }\n  ]\n}\n```\n\n#### GET /api/pages/:page\n\nGet the contents of a page.  Content is cached in memory for two minutes, so responses may be slightly stale.\n\n```bash\n$ curl localhost/api/pages/my-page\n\n{\n  \"page\": {\n    \"tokens\": [\n      {\"type\":\"heading\",\"depth\":1,\"text\":\"Title\"},\n      {\"type\":\"paragraph\",\"text\":\"Introductory paragraph text\"},\n      {\"type\":\"heading\",\"depth\":2,\"text\":\"Heading\"},\n      {\"type\":\"paragraph\",\"text\":\"Descriptive paragraph text\"}\n    ],\n    \"content\": \"\n      \u003csection data-level=1 id=\\\"title\\\"\u003e\n        \u003ch1\u003eTitle\u003c/h1\u003e\n        \u003cp\u003eIntroductory paragraph text\u003c/p\u003e\n        \u003csection data-level=2 id=\\\"heading\\\"\u003e\n          \u003ch2\u003eHeading\u003c/h2\u003e\n          \u003cp\u003eDescriptive paragraph text\u003c/p\u003e\n        \u003c/section\u003e\n      \u003c/section\u003e\n    \",\n    \"source\": \"\n      # Title\n\n      Introductory paragraph text\n\n      ## Heading\n\n      Descriptive paragraph text\n    \",\n    \"metadata\":{\n      \"name\": \"my-page\",\n      \"hash\":\"8bf901e\",\n      \"author\":\"admin\",\n      \"date\":\"Sun, 24 Oct 2021 15:47:47 -0400\",\n      \"relDate\":\"now\",\n      \"timestamp\":\"1635104867\",\n    }\n    \"attributes\": {\n      template: \"landing-page\"\n    }\n  }\n}\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fframeable%2Fjunco-cms","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fframeable%2Fjunco-cms","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fframeable%2Fjunco-cms/lists"}