{"_id":"@asahi-fj/structcms","_rev":"3-3d871f66c3ef48c6910e4d259749a80d","name":"@asahi-fj/structcms","dist-tags":{"latest":"0.1.6"},"versions":{"0.1.4":{"name":"@asahi-fj/structcms","version":"0.1.4","keywords":[],"author":{"name":"asahi-fj"},"license":"ISC","_id":"@asahi-fj/structcms@0.1.4","maintainers":[{"name":"asahi-fj","email":"asahi.public@gmail.com"}],"homepage":"https://github.com/asahi-fj/structcms#readme","bugs":{"url":"https://github.com/asahi-fj/structcms/issues"},"dist":{"shasum":"c68683e7a7c7eb171adbcc406b3c3540bf184073","tarball":"https://registry.npmjs.org/@asahi-fj/structcms/-/structcms-0.1.4.tgz","fileCount":22,"integrity":"sha512-8nJ3l6ye38pPpXoNjdIOVw5EMZlbMuP/F8asbhkmV8pb71y8w7cEiYKcWWirAkink+N4RaGA0LlFpXPcN+ThCw==","signatures":[{"sig":"MEUCIQC6zZohAtKY1SHdEkQTJZfcJ2FzQ+I7nz54bd/BZn2hiAIgecjZz0+ezKk56L84vCKPEAyKHzCBiA6eZ1TJYj1yYtE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14956},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"4d5093966dc1fc4db126226878b8f205e7847b7a","scripts":{"cli":"tsx src/cli.ts","test":"vitest","build":"tsc","test:run":"vitest run","prepublishOnly":"npm run build"},"_npmUser":{"name":"asahi-fj","email":"asahi.public@gmail.com"},"repository":{"url":"git+https://github.com/asahi-fj/structcms.git","type":"git"},"_npmVersion":"10.9.0","description":"GitHub as a CMS — fetch, transform, render content via GitHub API","directories":{},"_nodeVersion":"22.12.0","dependencies":{"dotenv":"^17.4.1","marked":"^18.0.0","@octokit/rest":"^22.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vitest":"^4.1.4","typescript":"^6.0.2","@types/node":"^25.6.0"},"_npmOperationalInternal":{"tmp":"tmp/structcms_0.1.4_1775891974941_0.3197954282482798","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@asahi-fj/structcms","version":"0.1.5","keywords":[],"author":{"name":"asahi-fj"},"license":"ISC","_id":"@asahi-fj/structcms@0.1.5","maintainers":[{"name":"asahi-fj","email":"asahi.public@gmail.com"}],"homepage":"https://github.com/asahi-fj/structcms#readme","bugs":{"url":"https://github.com/asahi-fj/structcms/issues"},"dist":{"shasum":"06c8c06445291fe3343ad6cfaa90d63c593a2e00","tarball":"https://registry.npmjs.org/@asahi-fj/structcms/-/structcms-0.1.5.tgz","fileCount":22,"integrity":"sha512-8eNC58FI42n5A5JztUvRPwrWjz6o3URRg7ZPpdEbkRzlHkh7u8A/tCBA1PhnmH+2MBBkTR4O/QthGhwsVXdkFg==","signatures":[{"sig":"MEUCIBZ8yCpfCjRe+JfFcaPQSazb9Oz7oU41x5gOF954GDFCAiEAwzqAj4mvWuQaAlW2xwc6JXvHvFW6VtekiOajo0twia8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15599},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"97c1644146e0b8125ea148d339e976c01e776a08","scripts":{"cli":"tsx src/cli.ts","test":"vitest","build":"tsc","test:run":"vitest run","prepublishOnly":"npm run build"},"_npmUser":{"name":"asahi-fj","email":"asahi.public@gmail.com"},"repository":{"url":"git+https://github.com/asahi-fj/structcms.git","type":"git"},"_npmVersion":"10.9.0","description":"GitHub as a CMS — fetch, transform, render content via GitHub API","directories":{},"_nodeVersion":"22.12.0","dependencies":{"dotenv":"^17.4.1","marked":"^18.0.0","@octokit/rest":"^22.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vitest":"^4.1.4","typescript":"^6.0.2","@types/node":"^25.6.0"},"_npmOperationalInternal":{"tmp":"tmp/structcms_0.1.5_1776080463632_0.15250448010792805","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@asahi-fj/structcms","version":"0.1.6","type":"module","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"import":"./dist/index.js","types":"./dist/index.d.ts"}},"scripts":{"build":"tsc","test":"vitest","test:run":"vitest run","cli":"tsx src/cli.ts","prepublishOnly":"npm run build"},"repository":{"type":"git","url":"git+https://github.com/asahi-fj/structcms.git"},"keywords":["cms","headless-cms","github-cms","git-based-cms","file-based-cms","content-management","content-management-system","nextjs","nextjs-cms","react-cms","nodejs","typescript","markdown","markdown-cms","mdx","mdx-cms","blog","blog-cms","static-site","static-site-generator","jamstack","github-api","repo-as-database","no-database","no-backend","serverless-cms","developer-tools","frontend-tools","oss","lightweight","minimal-cms"],"author":{"name":"asahi-fj"},"license":"ISC","description":"GitHub as a CMS — fetch, transform, render content via GitHub API","dependencies":{"@octokit/rest":"^22.0.1","dotenv":"^17.4.1","marked":"^18.0.0"},"devDependencies":{"@types/node":"^25.6.0","tsx":"^4.21.0","typescript":"^6.0.2","vitest":"^4.1.4"},"_id":"@asahi-fj/structcms@0.1.6","gitHead":"6c260a668b16dedc8326afe43f4eaf272d8db7d3","bugs":{"url":"https://github.com/asahi-fj/structcms/issues"},"homepage":"https://github.com/asahi-fj/structcms#readme","_nodeVersion":"22.12.0","_npmVersion":"10.9.0","dist":{"integrity":"sha512-l8CVJdHL5yijC0WkGsg9oEivyqhH7CTHU3QMH/b+4/ETpMAEPwkrNB509nMcp+0e5eJsvuSQeZoLu0Wdx2BgPQ==","shasum":"5981ef376a2a0d5d20ded233623f321f79ba615d","tarball":"https://registry.npmjs.org/@asahi-fj/structcms/-/structcms-0.1.6.tgz","fileCount":22,"unpackedSize":16182,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDwrWnT0QBawh32k7T7RIRv8qx5bbzypUYrRlRjaBWJfAIhAP6fGI6a0j4YzeLsGi5XaMMtH1dEc2HCM57aQmbJYycH"}]},"_npmUser":{"name":"asahi-fj","email":"asahi.public@gmail.com"},"directories":{},"maintainers":[{"name":"asahi-fj","email":"asahi.public@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/structcms_0.1.6_1776085764108_0.33217485396471425"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-11T07:19:34.834Z","modified":"2026-04-13T13:09:24.388Z","0.1.4":"2026-04-11T07:19:35.127Z","0.1.5":"2026-04-13T11:41:03.780Z","0.1.6":"2026-04-13T13:09:24.285Z"},"bugs":{"url":"https://github.com/asahi-fj/structcms/issues"},"author":{"name":"asahi-fj"},"license":"ISC","homepage":"https://github.com/asahi-fj/structcms#readme","keywords":["cms","headless-cms","github-cms","git-based-cms","file-based-cms","content-management","content-management-system","nextjs","nextjs-cms","react-cms","nodejs","typescript","markdown","markdown-cms","mdx","mdx-cms","blog","blog-cms","static-site","static-site-generator","jamstack","github-api","repo-as-database","no-database","no-backend","serverless-cms","developer-tools","frontend-tools","oss","lightweight","minimal-cms"],"repository":{"type":"git","url":"git+https://github.com/asahi-fj/structcms.git"},"description":"GitHub as a CMS — fetch, transform, render content via GitHub API","maintainers":[{"name":"asahi-fj","email":"asahi.public@gmail.com"}],"readme":"# structcms\n\nUse GitHub as a headless CMS. Fetch and transform content stored in a GitHub repository via the GitHub API.\n\n## Why structcms?\n\nstructcms treats a GitHub repository as your content store — no extra infrastructure, no vendor lock-in.\n\n| Feature | structcms | Outstatic | Decap CMS | Contentlayer |\n|---|---|---|---|---|\n| Zero added infrastructure | ✅ No DB, no server | ✅ | ⚠️ Needs Git Gateway / Netlify | ✅ |\n| Separate content & app repos | ✅ Any repo, any owner | ❌ Same repo only | ⚠️ Manual config | ❌ Local files only |\n| Private repository support | ✅ Token-based access | ❌ Public repos only | ⚠️ Limited | ✅ |\n| Setup requirement | GitHub Token only | GitHub OAuth App | Netlify / OAuth | Local file system |\n\n## How it works\n\nStore content under a `contents/` directory in any GitHub repository. Each piece of content lives in its own slug-named folder with a Markdown file and a JSON metadata file.\n\n```\nyour-content-repo/\n└── contents/\n    ├── hello-world/\n    │   ├── content.md\n    │   └── meta.json\n    └── my-second-post/\n        ├── content.md\n        └── meta.json\n```\n\n## Installation\n\n```bash\nnpm install @asahi-fj/structcms\n```\n\n## Quick start\n\n```ts\nimport StructCms from \"@asahi-fj/structcms\";\n\nconst cms = StructCms({\n  token: process.env.GITHUB_TOKEN!,\n  owner: \"your-org\",\n  repo: \"your-content-repo\",\n});\n\nconst posts = await cms.getAll();\n// [{ slug: \"hello-world\", content: \"# Hello\\n...\", meta: { title: \"Hello World\", ... } }]\n```\n\nSee [USAGE.md](./USAGE.md) for full examples.\n\n## Content format\n\n**`meta.json`**\n```json\n{\n  \"title\": \"Post title\",\n  \"description\": \"A short description\",\n  \"publishedAt\": \"2026-04-11\",\n  \"draft\": false,\n  \"tags\": [\"typescript\", \"cms\"]\n}\n```\n\n**`content.md`** — standard Markdown.\n\n## API\n\n| Method | Description |\n|---|---|\n| `cms.getAll()` | Fetch all content entries |\n| `cms.getById(id)` | Fetch a single entry by slug _(coming soon)_ |\n\n## Requirements\n\n- Node.js 18+\n- GitHub Personal Access Token with read access to the content repository\n\n## License\n\nISC\n","readmeFilename":"README.md"}