{"_id":"@centrolabs/ngx-blogdown","_rev":"12-fcab58fe5489dc6594ae73577ed2a144","name":"@centrolabs/ngx-blogdown","dist-tags":{"latest":"2.0.0"},"versions":{"1.0.0":{"name":"@centrolabs/ngx-blogdown","version":"1.0.0","_id":"@centrolabs/ngx-blogdown@1.0.0","maintainers":[{"name":"aneshodza","email":"anes.hodza04@gmail.com"}],"homepage":"https://github.com/centrolabs/ngx-blogdown#readme","bugs":{"url":"https://github.com/centrolabs/ngx-blogdown/issues"},"bin":{"ngx-blogdown-index":"bin/ngx-blogdown-index.mjs"},"dist":{"shasum":"e9446066389fe67be3331f59839b42d6d4ba0088","tarball":"https://registry.npmjs.org/@centrolabs/ngx-blogdown/-/ngx-blogdown-1.0.0.tgz","fileCount":5,"integrity":"sha512-Rb/rvjwf8JGCL5ww1K6o+DRgZk09OQL1cAO76RN3wRaZoLL5I4Ac5hgsDgjyYrcH9b1diDdebnWvYdiIzJUSxw==","signatures":[{"sig":"MEYCIQDEmmvTlWT5hrGN/p4Qx7GvWuVWKefMBiqcRvkV8yLmSwIhAM+ATz3+qZ9BkYeVfxCqXZbFXo86FPXsWVBRz3eofa4W","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@centrolabs%2fngx-blogdown@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":18022},"module":"fesm2022/centrolabs-ngx-blogdown.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/centrolabs-ngx-blogdown.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"d72a9e86eabab920299c0c435cbe6dd7cd95537e","typings":"index.d.ts","_npmUser":{"name":"aneshodza","email":"anes.hodza04@gmail.com"},"deprecated":"Version no longer supported, update to >= 1.2","repository":{"url":"git+https://github.com/centrolabs/ngx-blogdown.git","type":"git"},"_npmVersion":"10.9.4","description":"A lightweight Angular library for building markdown-powered blogs. You handle the layout, we handle the pipeline.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.1","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"marked":"^17.0.0","@angular/core":"^20.3.0","@angular/common":"^20.3.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-blogdown_1.0.0_1773774105635_0.7375267821423646","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@centrolabs/ngx-blogdown","version":"1.1.0","_id":"@centrolabs/ngx-blogdown@1.1.0","maintainers":[{"name":"aneshodza","email":"anes.hodza04@gmail.com"}],"homepage":"https://github.com/centrolabs/ngx-blogdown#readme","bugs":{"url":"https://github.com/centrolabs/ngx-blogdown/issues"},"bin":{"ngx-blogdown-index":"bin/ngx-blogdown-index.mjs"},"dist":{"shasum":"adaa46226b97acfad3f951e581ff0c98330df6ed","tarball":"https://registry.npmjs.org/@centrolabs/ngx-blogdown/-/ngx-blogdown-1.1.0.tgz","fileCount":5,"integrity":"sha512-/vi7Ymk5zhPOmN0p/3TdZgjRo4lN+m7OQE12vM0oj4HeXB7M4nSr2ooUy67jmbqFcgr4pMvqo+wOWL52B+henA==","signatures":[{"sig":"MEUCIEyw08+Vn0p4OTtqEEJr62wR4Pp0ETfH0hpmc9z6PerOAiEApHphpRn+ghN9FaTQLckkbnZ9R2X6ebPl3JuJaeGgulE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@centrolabs%2fngx-blogdown@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":18024},"module":"fesm2022/centrolabs-ngx-blogdown.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/centrolabs-ngx-blogdown.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"b5e6debb4bd7de99433da1cd1643ea4b0356453f","typings":"index.d.ts","_npmUser":{"name":"aneshodza","email":"anes.hodza04@gmail.com"},"deprecated":"Version no longer supported, update to >= 1.2","repository":{"url":"git+https://github.com/centrolabs/ngx-blogdown.git","type":"git"},"_npmVersion":"10.9.4","description":"A lightweight Angular library for building markdown-powered blogs. You handle the layout, we handle the pipeline.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.1","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"marked":"^17.0.0","@angular/core":">=20.3.0","@angular/common":">=20.3.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-blogdown_1.1.0_1773774601019_0.9231462276020412","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@centrolabs/ngx-blogdown","version":"1.2.0","_id":"@centrolabs/ngx-blogdown@1.2.0","maintainers":[{"name":"aneshodza","email":"anes.hodza04@gmail.com"}],"homepage":"https://github.com/centrolabs/ngx-blogdown#readme","bugs":{"url":"https://github.com/centrolabs/ngx-blogdown/issues"},"bin":{"ngx-blogdown-index":"bin/ngx-blogdown-index.mjs"},"dist":{"shasum":"20105f0aa0ab203d7bbc2e1afca5e8b9f84d958f","tarball":"https://registry.npmjs.org/@centrolabs/ngx-blogdown/-/ngx-blogdown-1.2.0.tgz","fileCount":6,"integrity":"sha512-opr83FWidkp9ZZBAn380yrvSBJA+u+jwSQ687V8a4MnEk1jWDwamob4iJuORj9X5kHKUWVDiZPgyuB2Xd/C7aA==","signatures":[{"sig":"MEUCIQCF/1ZXX5MVZrYiwtoP0SfqabYVGJ2V4+MMszPtJUPdcgIgSLZRaSlX+1KzIf9e9ES19CtlR6T7SFDD5eHALLaOYsA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@centrolabs%2fngx-blogdown@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":19755},"module":"fesm2022/centrolabs-ngx-blogdown.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/centrolabs-ngx-blogdown.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"7a375894b7f126c5be88f3e2c967b273b79924d5","typings":"index.d.ts","_npmUser":{"name":"aneshodza","email":"anes.hodza04@gmail.com"},"repository":{"url":"git+https://github.com/centrolabs/ngx-blogdown.git","type":"git"},"_npmVersion":"10.9.4","description":"A lightweight Angular library for building markdown-powered blogs. You handle the layout, we handle the pipeline.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.1","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"marked":"^17.0.0","@angular/core":">=20.3.0","@angular/common":">=20.3.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-blogdown_1.2.0_1773775280965_0.35083426601475565","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@centrolabs/ngx-blogdown","version":"1.3.0","_id":"@centrolabs/ngx-blogdown@1.3.0","maintainers":[{"name":"aneshodza","email":"anes.hodza04@gmail.com"}],"homepage":"https://github.com/centrolabs/ngx-blogdown#readme","bugs":{"url":"https://github.com/centrolabs/ngx-blogdown/issues"},"bin":{"ngx-blogdown-index":"bin/ngx-blogdown-index.mjs"},"dist":{"shasum":"de7f46ea6c2243cee790e12e413855d10376af82","tarball":"https://registry.npmjs.org/@centrolabs/ngx-blogdown/-/ngx-blogdown-1.3.0.tgz","fileCount":6,"integrity":"sha512-Y8fn3OtA3fbJmRhRUg+lgdRLIVHMeQTyXOviXafGIhKDVFmxBSJ4+vahzGaiTKrqQ/YUEz6a2Q2XN8mo7Wbj3w==","signatures":[{"sig":"MEQCIE38fDTEzrvEMh0rswqd5MwyD59bQhAbSsUOCh9uIWjNAiBCcR3CmzF8hcF5g5qiLjZPaUKb8tAJu1etPx3aFMONCQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@centrolabs%2fngx-blogdown@1.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":20031},"module":"fesm2022/centrolabs-ngx-blogdown.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/centrolabs-ngx-blogdown.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"1c3a8ffae40325928c76f9f3f9fdfedfe252b46b","typings":"index.d.ts","_npmUser":{"name":"aneshodza","email":"anes.hodza04@gmail.com"},"repository":{"url":"git+https://github.com/centrolabs/ngx-blogdown.git","type":"git"},"_npmVersion":"10.9.4","description":"A lightweight Angular library for building markdown-powered blogs. You handle the layout, we handle the pipeline.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.1","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"marked":"^17.0.0","js-yaml":"^4.1.0","@angular/core":">=20.3.0","@angular/common":">=20.3.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-blogdown_1.3.0_1773923237138_0.5418921338112135","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@centrolabs/ngx-blogdown","version":"1.4.0","_id":"@centrolabs/ngx-blogdown@1.4.0","maintainers":[{"name":"aneshodza","email":"anes.hodza04@gmail.com"}],"homepage":"https://github.com/centrolabs/ngx-blogdown#readme","bugs":{"url":"https://github.com/centrolabs/ngx-blogdown/issues"},"bin":{"ngx-blogdown-index":"bin/ngx-blogdown-index.mjs"},"dist":{"shasum":"4235c555bd8ce5d2248e924edee08fa543bfdd1b","tarball":"https://registry.npmjs.org/@centrolabs/ngx-blogdown/-/ngx-blogdown-1.4.0.tgz","fileCount":6,"integrity":"sha512-ywEnTQ1E5Hd7Qzn1WE2KcuOlry01ofj6lul6tGtrLs/t28HLBbvQ0XbLF/qQWz+SPZRQ3zVq+QKF9hgwigjG+A==","signatures":[{"sig":"MEYCIQCgbmKuaMwBsHxsk+558KOOPVBJMyX42hyJ7/kAkgL5jQIhAM3aK7yThJXa56wwBxbrF5K6y9dLGrqPP6MgYEvbkda9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@centrolabs%2fngx-blogdown@1.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":22430},"module":"fesm2022/centrolabs-ngx-blogdown.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/centrolabs-ngx-blogdown.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"42374fee12edb66d6f6373e609b66bcce9d94075","typings":"index.d.ts","_npmUser":{"name":"aneshodza","email":"anes.hodza04@gmail.com"},"repository":{"url":"git+https://github.com/centrolabs/ngx-blogdown.git","type":"git"},"_npmVersion":"10.9.7","description":"A lightweight Angular library for building markdown-powered blogs. You handle the layout, we handle the pipeline.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.2","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"marked":"^17.0.0","js-yaml":"^4.1.0","@angular/core":">=20.3.0","@angular/common":">=20.3.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-blogdown_1.4.0_1776713670285_0.41776907107598404","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"@centrolabs/ngx-blogdown","version":"1.4.1","_id":"@centrolabs/ngx-blogdown@1.4.1","maintainers":[{"name":"aneshodza","email":"anes.hodza04@gmail.com"}],"homepage":"https://github.com/centrolabs/ngx-blogdown#readme","bugs":{"url":"https://github.com/centrolabs/ngx-blogdown/issues"},"bin":{"ngx-blogdown-index":"bin/ngx-blogdown-index.mjs"},"dist":{"shasum":"58be0c3a86034b2fa2193fe1214dbeb25e5425e3","tarball":"https://registry.npmjs.org/@centrolabs/ngx-blogdown/-/ngx-blogdown-1.4.1.tgz","fileCount":6,"integrity":"sha512-NcEre3ZGPxVSeCt3BeaAgtddzJvvRM6e3iXsrpKBPD3mwUPwSSn/PYcnZPY7tsYCM9X2CAZ0F7rwhggi83jRYg==","signatures":[{"sig":"MEUCIEKWc2AyjuI0HJZt8QZrNtBZuzn2FmWsJCdnNVeTgu1cAiEA7AKVKRRwfs/l6hlOLz78gUUTtCrHfwF2/nKiJDUP2oQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@centrolabs%2fngx-blogdown@1.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":22430},"module":"fesm2022/centrolabs-ngx-blogdown.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/centrolabs-ngx-blogdown.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"e401dd0b109b4a72f5957551531a0a932022c31b","typings":"index.d.ts","_npmUser":{"name":"aneshodza","email":"anes.hodza04@gmail.com"},"repository":{"url":"git+https://github.com/centrolabs/ngx-blogdown.git","type":"git"},"_npmVersion":"10.9.7","description":"A lightweight Angular library for building markdown-powered blogs. You handle the layout, we handle the pipeline.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.2","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"marked":"^17.0.0","js-yaml":"^4.1.0","@angular/core":">=20.3.0","@angular/common":">=20.3.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-blogdown_1.4.1_1776716652735_0.5205555716191632","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@centrolabs/ngx-blogdown","version":"1.5.0","_id":"@centrolabs/ngx-blogdown@1.5.0","maintainers":[{"name":"aneshodza","email":"anes.hodza04@gmail.com"}],"homepage":"https://github.com/centrolabs/ngx-blogdown#readme","bugs":{"url":"https://github.com/centrolabs/ngx-blogdown/issues"},"bin":{"ngx-blogdown-index":"bin/ngx-blogdown-index.mjs"},"dist":{"shasum":"0d3faf908f70c32a59dea16d4ed2a7663fd25b8f","tarball":"https://registry.npmjs.org/@centrolabs/ngx-blogdown/-/ngx-blogdown-1.5.0.tgz","fileCount":6,"integrity":"sha512-D3QRV/S+9d1bAEe4BXS4j48R2qy9BinSyJQ3fNV2gRtdIgd0daQ6WUIP52VjPjxOEygDTH/lJvf3X0RRPF/LsA==","signatures":[{"sig":"MEUCIDBHwxokr0kdbmOGHzZBSO40ZA64aeqVlAgbyPtpB/pJAiEA6uPE+KbGzrZuFO1XzoW8Jj6iGh/9rzzhOZlinUZxnwo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@centrolabs%2fngx-blogdown@1.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":24230},"module":"fesm2022/centrolabs-ngx-blogdown.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/centrolabs-ngx-blogdown.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"400fb73f3dea76fe4af8a6d0a64ad0f1c7bba737","typings":"index.d.ts","_npmUser":{"name":"aneshodza","email":"anes.hodza04@gmail.com"},"repository":{"url":"git+https://github.com/centrolabs/ngx-blogdown.git","type":"git"},"_npmVersion":"10.9.7","description":"A lightweight Angular library for building markdown-powered blogs. You handle the layout, we handle the pipeline.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.2","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"marked":"^17.0.0","js-yaml":"^4.1.0","@angular/core":">=20.3.0","@angular/common":">=20.3.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-blogdown_1.5.0_1778898862083_0.7943849199891371","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@centrolabs/ngx-blogdown","version":"2.0.0","description":"A lightweight Angular library for building markdown-powered blogs. You handle the layout, we handle the pipeline.","peerDependencies":{"@angular/common":">=20.3.0","@angular/core":">=20.3.0","js-yaml":"^4.1.0","marked":"^17.0.0"},"dependencies":{"tslib":"^2.3.0"},"sideEffects":false,"bin":{"ngx-blogdown-index":"bin/ngx-blogdown-index.mjs"},"repository":{"type":"git","url":"git+https://github.com/centrolabs/ngx-blogdown.git"},"module":"fesm2022/centrolabs-ngx-blogdown.mjs","typings":"index.d.ts","exports":{"./package.json":{"default":"./package.json"},".":{"types":"./index.d.ts","default":"./fesm2022/centrolabs-ngx-blogdown.mjs"}},"_id":"@centrolabs/ngx-blogdown@2.0.0","gitHead":"45de2fae2e4c4703cbc78c08c9b4ecb39f9f8261","bugs":{"url":"https://github.com/centrolabs/ngx-blogdown/issues"},"homepage":"https://github.com/centrolabs/ngx-blogdown#readme","_nodeVersion":"22.22.2","_npmVersion":"10.9.7","dist":{"integrity":"sha512-6zSnBjuPf1ceyF4hjb8j7gWBEpyMfSiAzLa8A15hKYxj5BX9OuYuY5bU1xses8qvIvSursX5hUXF+MRWpXOeFQ==","shasum":"639235fbf7fb76c8d9c199246c319bb47d745e7e","tarball":"https://registry.npmjs.org/@centrolabs/ngx-blogdown/-/ngx-blogdown-2.0.0.tgz","fileCount":6,"unpackedSize":30817,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@centrolabs%2fngx-blogdown@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAdf/6oXopMkw/eXxFkfm3louBGnusBEcujfsl1DWb7nAiEAyWJLcw/ak/v0SP+oeowMB9tJTV0cF3Ck+ux4Y96kkRA="}]},"_npmUser":{"name":"aneshodza","email":"anes.hodza04@gmail.com"},"directories":{},"maintainers":[{"name":"aneshodza","email":"anes.hodza04@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ngx-blogdown_2.0.0_1778932839761_0.4890426829567145"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-17T19:01:45.510Z","modified":"2026-05-16T12:00:40.247Z","1.0.0":"2026-03-17T19:01:45.765Z","1.1.0":"2026-03-17T19:10:01.175Z","1.2.0":"2026-03-17T19:21:21.128Z","1.3.0":"2026-03-19T12:27:17.292Z","1.4.0":"2026-04-20T19:34:30.474Z","1.4.1":"2026-04-20T20:24:12.908Z","1.5.0":"2026-05-16T02:34:22.235Z","2.0.0":"2026-05-16T12:00:39.914Z"},"bugs":{"url":"https://github.com/centrolabs/ngx-blogdown/issues"},"homepage":"https://github.com/centrolabs/ngx-blogdown#readme","repository":{"type":"git","url":"git+https://github.com/centrolabs/ngx-blogdown.git"},"description":"A lightweight Angular library for building markdown-powered blogs. You handle the layout, we handle the pipeline.","maintainers":[{"name":"aneshodza","email":"anes.hodza04@gmail.com"}],"readme":"# @centrolabs/ngx-blogdown\n\nA lightweight Angular library for building markdown-powered blogs. You handle the layout, we handle the pipeline.\n\n## Installation\n\n```bash\nnpm install @centrolabs/ngx-blogdown marked js-yaml\n```\n\n## Setup\n\n### 1. Provide the library\n\n```ts\nimport { provideHttpClient } from '@angular/common/http';\nimport { provideNgBlogdown } from '@centrolabs/ngx-blogdown';\n\nbootstrapApplication(AppComponent, {\n  providers: [\n    provideHttpClient(),\n    provideNgBlogdown({\n      indexPath: '/blog/index.json',\n      postsDir: '/blog/posts',\n      // Optional: prefix relative image paths in post markdown.\n      // `![alt](foo.png)` → `<img src=\"/blog/images/foo.png\">`\n      imagesDir: '/blog/images',\n    }),\n  ],\n});\n```\n\n### 2. Write your posts\n\nCreate markdown files with YAML frontmatter in your posts directory:\n\n```markdown\ntitle: My First Post\ndate: 2026-01-15\ncover: /images/first-post.png\ntagline: A short description of this post\nauthor: Jane Doe\n# readTime: 5   # optional — auto-computed from word count when omitted\n\n---\n\n# My First Post\n\nWrite your content here using **markdown**.\n```\n\n### 3. Generate the index\n\nUse the bundled CLI to generate a JSON index from your markdown files:\n\n```bash\nnpx ngx-blogdown-index --postsDir src/content/posts --out src/content/index.json\n```\n\nThis scans all `.md` files, extracts frontmatter, and outputs a sorted JSON index.\n\n## Usage\n\nInject `BlogService` anywhere you need blog data:\n\n```ts\nimport { BlogService, BlogPostBase } from '@centrolabs/ngx-blogdown';\n\n// Extend BlogPostBase with your own frontmatter fields\ninterface MyPost extends BlogPostBase {\n  date: string;\n  tagline: string;\n  cover: string;\n  author: string;\n}\n\n@Component({\n  template: `\n    @for (post of posts; track post.slug) {\n      <article>\n        <h2>{{ post.title }}</h2>\n        <p>{{ post.tagline }}</p>\n      </article>\n    }\n  `,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BlogListComponent {\n  private blogService = inject(BlogService);\n  posts: MyPost[] = [];\n\n  async ngOnInit() {\n    this.posts = await this.blogService.getPosts<MyPost>();\n  }\n}\n```\n\n### Rendering a single post\n\n```ts\nconst post = await this.blogService.getPost<MyPost>('my-first-post');\nif (post) {\n  // post.htmlContent contains the rendered HTML\n  // post.date, post.author, etc. are typed\n}\n```\n\n### SEO tags\n\n```ts\nconst meta = posts.find((p) => p.slug === 'my-first-post')!;\nconst seo = this.blogService.getSeoTags(meta);\n// { title, description, image, date, author }\n```\n\n### Multilingual posts\n\nDrop a `<base>.<lang>.md` next to a post to publish a localized version:\n\n```\nposts/\n  My First Post.md       # base (default language)\n  My First Post.de.md    # German variant\n  My First Post.fr.md    # French variant\n```\n\nThe CLI groups each variant under `translations[lang]` on its base entry, so\nthe index keeps a single row per post. Variants only need the frontmatter\nfields that actually differ — any field they omit falls back to the base.\n\nWire the active language by passing a `lang` getter (and use the factory form\nof `provideNgBlogdown` if it depends on another injectable):\n\n```ts\nprovideNgBlogdown(() => {\n  const i18n = inject(TranslationService);\n  return {\n    indexPath: '/blog/index.json',\n    postsDir: '/blog/posts',\n    lang: () => i18n.lang(),\n  };\n});\n```\n\n`getPosts()` and `getPost()` now merge the matching translation onto the base\npost automatically. Region codes like `pt-BR` are supported. Slugs always\ncome from the base filename, so URLs stay stable across languages.\n\n## API\n\n### `provideNgBlogdown(config | factory)`\n\nRegisters the library providers. Call this in your application bootstrap.\nPass a static config object, or a factory that runs in an injection context\nwhen the config depends on other injectables.\n\n| Field                 | Type                  | Description                                                              |\n| --------------------- | --------------------- | ------------------------------------------------------------------------ |\n| `config.indexPath`    | `string`              | Path to the JSON index file                                              |\n| `config.postsDir`     | `string`              | Directory where markdown files are served                                |\n| `config.imagesDir?`   | `string`              | Optional prefix for relative image paths inside post markdown            |\n| `config.lang?`        | `() => string \\| null` | Optional active language; selects the matching `translations[lang]` entry |\n\n### `BlogService`\n\n| Method                 | Returns                        | Description                                         |\n| ---------------------- | ------------------------------ | --------------------------------------------------- |\n| `getPosts<T>()`        | `Promise<T[]>`                 | Fetches all post metadata. Cached after first call. |\n| `getPost<T>(slug)`     | `Promise<BlogPost<T> \\| null>` | Fetches and renders a single post by slug.          |\n| `getSeoTags(postMeta)` | `SeoTags`                      | Derives SEO meta tags from post metadata.           |\n\n### CLI: `ngx-blogdown-index`\n\n```\nngx-blogdown-index --postsDir <path> --out <file>\n```\n\n| Flag         | Description                              |\n| ------------ | ---------------------------------------- |\n| `--postsDir` | Directory containing `.md` files         |\n| `--out`      | Output path for the generated JSON index |\n\nThe generated index is sorted by date (newest first). Slugs are derived from filenames (lowercased, spaces replaced with hyphens). Each post's `readTime` (in minutes) is auto-computed from its body word count at ~200 wpm unless overridden in frontmatter.\n\n### Built-in fields on `BlogPostBase`\n\n| Field      | Type     | Source                                                                              |\n| ---------- | -------- | ----------------------------------------------------------------------------------- |\n| `slug`     | `string` | Derived from filename                                                               |\n| `filename` | `string` | Markdown filename                                                                   |\n| `title`    | `string` | Frontmatter `title:` (falls back to filename)                                       |\n| `author`   | `string` | Frontmatter `author:` (optional)                                                    |\n| `readTime` | `number` | Frontmatter `readTime:` or auto-computed minutes from body word count (minimum `1`) |\n\n## Peer Dependencies\n\n| Package           | Version    |\n| ----------------- | ---------- |\n| `@angular/core`   | `>=20.3.0` |\n| `@angular/common` | `>=20.3.0` |\n| `js-yaml`         | `^4.1.0`   |\n| `marked`          | `^17.0.0`  |\n\n## License\n\nMIT\n","readmeFilename":"README.md"}