{"id":26786669,"url":"https://github.com/sveltek/markdown","last_synced_at":"2026-01-05T23:10:19.214Z","repository":{"id":282244743,"uuid":"941102023","full_name":"sveltek/markdown","owner":"sveltek","description":"Svelte Markdown Preprocessor.","archived":false,"fork":false,"pushed_at":"2025-04-17T15:36:27.000Z","size":537,"stargazers_count":6,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-18T06:13:45.353Z","etag":null,"topics":["kit","markdown","md","mdx","preprocess","preprocessor","svelte","svelte-kit","svelte-markdown","svelte-md","svelte-mdx","svelte-plugin","svelte-preprocess","sveltek"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/sveltek.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/codeowners","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-03-01T13:48:17.000Z","updated_at":"2025-04-17T15:35:24.000Z","dependencies_parsed_at":null,"dependency_job_id":"eed05299-68b0-452a-9f7e-ceb43d2fe7cc","html_url":"https://github.com/sveltek/markdown","commit_stats":null,"previous_names":["hypernym-studio/svelte-markdown","sveltek/markdown"],"tags_count":15,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sveltek%2Fmarkdown","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sveltek%2Fmarkdown/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sveltek%2Fmarkdown/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sveltek%2Fmarkdown/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sveltek","download_url":"https://codeload.github.com/sveltek/markdown/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249529088,"owners_count":21286431,"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","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":["kit","markdown","md","mdx","preprocess","preprocessor","svelte","svelte-kit","svelte-markdown","svelte-md","svelte-mdx","svelte-plugin","svelte-preprocess","sveltek"],"created_at":"2025-03-29T12:16:15.151Z","updated_at":"2026-01-05T23:10:19.176Z","avatar_url":"https://github.com/sveltek.png","language":"TypeScript","readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./media/cover.png\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003e@sveltek/markdown\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003eSvelte Markdown Preprocessor.\u003c/p\u003e\n\n\u003cbr\u003e\n\n\u003e [!NOTE]\n\u003e\n\u003e While the **API** is solid and mostly complete, some changes may still occur before the first stable release.\n\u003e\n\u003e Ideas, [suggestions](https://github.com/sveltek/markdown/discussions) and code [contributions](.github/CONTRIBUTING.md) are welcome.\n\u003e\n\u003e If you find any issues or bugs, please [report](https://github.com/sveltek/markdown/issues/new/choose) them so the project can be improved.\n\n\u003cbr\u003e\n\n## Core Concepts\n\n- **Custom Components:** Simplifies development by supporting `import`/`export` of reusable components.\n- **Named Layouts:** Provides a powerful named `layout` mechanism to completely customize page design.\n- **Unique Entries:** Defines specialized, `entry-level` configuration adapted for all markdown files.\n- **Unified Plugins:** Enables content transformation using widely-adopted tools like `remark` and `rehype`.\n- **Global Frontmatter:** Streamlines workflow by offering centralized options for markdown `metadata`.\n- **Global Components:** Defines `global components` that can be used in all markdown files without manual setup.\n- **Special Elements:** Supports parsing Svelte special elements such as `svelte:head` etc. in markdown files.\n- **Code Highlighter:** Offers quick and easy customization for `syntax highlighting`.\n\n## Intro\n\n**Svelte Markdown** has been completely rewritten to take full advantage of `Svelte 5` and its `Runes` mode.\n\nIt’s a light, simple and powerful preprocessor designed specifically for managing `Markdown` content within `Svelte` projects.\n\nAlso, it comes with zero-config setup, built-in types and a dev-friendly API.\n\n## Docs\n\nThe plan is to create online docs soon, so until its published, feel free to ask questions or share feedback in the official [Discussions](https://github.com/sveltek/markdown/discussions).\n\n## Installation\n\n```sh\n# via pnpm\npnpm add -D @sveltek/markdown\n```\n\n```sh\n# via npm\nnpm install -D @sveltek/markdown\n```\n\n## Usage\n\n### Zero-Config Setup\n\n```js\n// svelte.config.js\n\nimport adapter from '@sveltejs/adapter-static'\nimport { svelteMarkdown } from '@sveltek/markdown'\n\n/** @type {import('@sveltejs/kit').Config} */\nconst config = {\n  preprocess: [svelteMarkdown()],\n  extensions: ['.svelte', '.md'],\n  kit: { adapter: adapter() },\n}\n\nexport default config\n```\n\n### Custom Config Setup\n\n```js\n// markdown.config.js\n\nimport { defineConfig } from '@sveltek/markdown'\n\nexport const markdownConfig = defineConfig({\n  frontmatter: {\n    defaults: {\n      layout: 'default',\n      author: {\n        name: 'Sveltek',\n        url: 'https://github.com/sveltek',\n      },\n      // other global data...\n    },\n  },\n  layouts: [\n    {\n      name: 'default',\n      path: 'lib/content/layouts/default/layout.svelte',\n    },\n    {\n      name: 'blog',\n      path: 'lib/content/layouts/blog/layout.svelte',\n      plugins: {\n        remark: [],\n        rehype: [],\n      },\n    },\n    // other layouts...\n  ],\n})\n```\n\nImport the config to the `svelte.config.js` file:\n\n```js\n// svelte.config.js\n\nimport adapter from '@sveltejs/adapter-static'\nimport { svelteMarkdown } from '@sveltek/markdown'\nimport { markdownConfig } from './markdown.config.js'\n\n/** @type {import('@sveltejs/kit').Config} */\nconst config = {\n  preprocess: [svelteMarkdown(markdownConfig)],\n  extensions: ['.svelte', '.md'],\n  kit: { adapter: adapter() },\n}\n\nexport default config\n```\n\n### Types\n\nIf you work with `TypeScript` and `Markdown` components, you can define types to avoid potential issues when importing `.md` into `.svelte` files.\n\n```ts\n// src/app.d.ts\n\ndeclare global {\n  namespace App {\n    declare module '*.md' {\n      import type { Component } from 'svelte'\n\n      declare const MarkdownComponent: Component\n\n      export default MarkdownComponent\n    }\n  }\n}\n\nexport {}\n```\n\nNow you can import `.md` file into `.svelte` without type errors:\n\n```html\n\u003c!-- +page.svelte --\u003e\n\n\u003cscript lang=\"ts\"\u003e\n  import Comp from '$lib/content/components/comp.md'\n\u003c/script\u003e\n\n\u003cComp /\u003e\n```\n\n## Examples\n\n\u003e [!NOTE]\n\u003e\n\u003e More examples will be added to the online docs.\n\n### Playground\n\nExplore the [playground](https://github.com/sveltek/markdown/tree/main/playgrounds/sveltekit) to see more details.\n\n### Custom Components\n\n```markdown\n---\ntitle: Page Title\n---\n\n\u003cscript lang=\"ts\"\u003e\n  import { Component } from '$lib/components'\n\u003c/script\u003e\n\n\u003cComponent /\u003e\n\n\u003cComponent prop=\"data\" /\u003e\n\n\u003cComponent\u003e\nChildren content\n\u003c/Component\u003e\n\nContent...\n```\n\n```markdown\n---\ntitle: Page Title\n---\n\n\u003cscript lang=\"ts\"\u003e\n  import { Component } from '$lib/components'\n\u003c/script\u003e\n\n::Component\n\n::Component prop=\"data\"\n\n::Component\nChildren content\n::\n\nContent...\n```\n\n### Named Layouts\n\n```markdown\n---\ntitle: Page Title\nlayout: default\n---\n\nContent...\n```\n\n```markdown\n---\nlayout: false\n---\n\nContent...\n```\n\n### Unique Entries\n\n```markdown\n---\ntitle: Page Title\nentry: blog\n---\n\nContent...\n```\n\n```markdown\n---\nentry: false\n---\n\nContent...\n```\n\n### Global Components\n\n```ts\n// markdown.config.js\n\nimport { defineConfig } from '@sveltek/markdown'\n\nexport const markdownConfig = defineConfig({\n  components: [\n    {\n      name: 'Link',\n      path: 'src/lib/components/ui/Link.svelte',\n    },\n    {\n      name: 'Button',\n      path: 'src/components/button/Button.svelte',\n    },\n    // ...\n  ],\n})\n```\n\n```markdown\n---\ntitle: About page\ndescription: Svelte Markdown Preprocessor.\n---\n\n\u003cLink /\u003e\n\n\u003cButton /\u003e\n\nContent...\n```\n\n### Special Elements\n\n```markdown\n---\ntitle: About page\ndescription: Svelte Markdown Preprocessor.\nlayout: false\nspecialElements: true\n---\n\n\u003csvelte:head\u003e\n\n  \u003ctitle\u003eCustom Title - {title}\u003c/title\u003e\n  \u003cmeta name=\"description\" content={`Custom Description - ${description}`} /\u003e\n\u003c/svelte:head\u003e\n\n\u003cstyle\u003e\n  p { \n    opacity: 0.6;\n    font-family: monospace;\n    font-size: 1.125rem;\n  }\n\u003c/style\u003e\n\n{description}\n\nContent...\n```\n\n## Code Highlighting\n\n### Shiki Syntax Highlighter\n\n#### rehypeShiki plugin\n\nRecommended way is to simply import the official `rehypeShiki` plugin from `@sveltek/unplugins`.\n\nIt's super flexible and easy, you can apply it to just one page, to specific layouts, or to all pages if needed.\n\nPlugin works without additional configuration, but if you want you can configure it further via plugin options.\n\n\u003e Install the required dependencies before use.\n\u003e\n\u003e ```sh\n\u003e pnpm add -D @sveltek/unplugins shiki\n\u003e ```\n\n```ts\nimport { svelteMarkdown } from '@sveltek/markdown'\nimport { rehypeShiki } from '@sveltek/unplugins'\n\nsvelteMarkdown({\n  plugins: {\n    rehype: [[rehypeShiki, { theme: 'github-light-default' }]],\n  },\n})\n```\n\n#### highlight option\n\nIt is also possible to use the `highlight` option which is a powerful way if you need more advanced configuration, but this require manual setup. Keep in mind that this applies to all pages, so it may not be desirable in every case.\n\n\u003e Install the required dependencies before use.\n\u003e\n\u003e ```sh\n\u003e pnpm add -D shiki\n\u003e ```\n\n```ts\nimport { createHighlighter } from 'shiki'\n\nconst theme = 'github-dark-default'\nconst highlighter = await createHighlighter({\n  themes: [theme],\n  langs: ['javascript', 'typescript', 'svelte'],\n})\n\nsvelteMarkdown({\n  highlight: {\n    highlighter: async ({ lang, code }) =\u003e {\n      return highlighter.codeToHtml(code, { lang, theme })\n    },\n  },\n})\n```\n\n## Plugins\n\n### Remark Table of Contents (Toc)\n\n\u003e Install the required dependencies before use.\n\u003e\n\u003e ```sh\n\u003e pnpm add -D @sveltek/unplugins\n\u003e ```\n\n```js\nimport { remarkToc } from '@sveltek/unplugins'\n\nsvelteMarkdown({\n  plugins: {\n    remark: [remarkToc],\n  },\n})\n```\n\nUsage in markdown page:\n\n```markdown\n---\ntitle: Blog page\ndescription: Read the latest news.\n---\n\n## What's New\n\n## Featured Posts\n\n\u003cul\u003e\n  {#each frontmatter.toc as toc}\n    \u003cli\u003e\u003ca href=\"#{toc.id}\"\u003e{toc.value}\u003c/a\u003e\u003c/li\u003e\n  {/each}\n\u003c/ul\u003e\n```\n\n### Remark Reading Stats\n\n\u003e Install the required dependencies before use.\n\u003e\n\u003e ```sh\n\u003e pnpm add -D @sveltek/unplugins\n\u003e ```\n\n```js\nimport { remarkReadingStats } from '@sveltek/unplugins'\n\nsvelteMarkdown({\n  plugins: {\n    remark: [remarkReadingStats],\n  },\n})\n```\n\nUsage in markdown page:\n\n```markdown\n---\ntitle: Page title\n---\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n\nReading Stats {JSON.stringify(readingStats)}\n\nReading Time: {readingStats.text}\n```\n\n## API\n\n```ts\nimport { svelteMarkdown, defineConfig, compile } from '@sveltek/markdown'\n\nimport { escapeSvelte } from '@sveltek/markdown/utils'\n```\n\n### preprocessor\n\n- Type: `function svelteMarkdown(config?: MarkdownConfig): PreprocessorGroup`\n\n```ts\nimport { svelteMarkdown } from '@sveltek/markdown'\n\nsvelteMarkdown(config)\n```\n\n### defineConfig\n\n- Type: `function defineConfig(config: MarkdownConfig): MarkdownConfig`\n\n```ts\nimport { defineConfig } from '@sveltek/markdown'\n\ndefineConfig(config)\n```\n\n### compile\n\n- Type: `function compile(source: string, options: CompileOptions): Promise\u003cProcessed\u003e`\n\n```ts\nimport { compile } from '@sveltek/markdown'\n\ncompile(source, options)\n```\n\n### escapeSvelte\n\n- Type: `function escapeSvelte(value: string): string`\n\n```ts\nimport { escapeSvelte } from '@sveltek/markdown/utils'\n\nescapeSvelte(value)\n```\n\n## Types\n\n### main\n\nImports all types from the main package.\n\n```ts\nimport type {\n  ASTScript,\n  CompileOptions,\n  Entries,\n  Entry,\n  FileData,\n  Frontmatter,\n  Highlight,\n  Layout,\n  Layouts,\n  MarkdownConfig,\n  Plugin,\n  PluginList,\n  Plugins,\n} from '@sveltek/markdown'\n```\n\n## Options\n\nAll options are documented with descriptions and examples so autocompletion will be offered as you type. Simply hover over the property and see what it does in the quick info tooltip.\n\n### extensions\n\n- Type: `string[]`\n- Default: `['.md']`\n\nSpecifies custom file extensions.\n\n```ts\nsvelteMarkdown({\n  extensions: ['.md'],\n})\n```\n\n### preprocessors\n\n- Type: `PreprocessorGroup[]`\n- Default: `undefined`\n\nSpecifies a custom list of preprocessors that will be applied to a Svelte file.\n\n```ts\nsvelteMarkdown({\n  preprocessors: [vitePreprocess()],\n})\n```\n\n### plugins\n\n- Type: `{ remark: [], rehype: [] }`\n- Default: `undefined`\n\nSpecifies the **top-level** plugins that will be used for all markdown files.\n\n- **Lifecycle:** `plugins` → `layout.plugins` → `entry.plugins`\n\n```ts\nsvelteMarkdown({\n  plugins: {\n    remark: [], // Specifies custom `remark` plugins at the top-level (optional).\n    rehype: [], // Specifies custom `rehype` plugins at the top-level (optional).\n  },\n})\n```\n\nAlso, plugins can be disabled at the **file-level**:\n\n```markdown\n---\ntitle: Page title\nplugins:\n  remark: false # Disables remark plugins for this file only\n  rehype: false # Disables rehype plugins for this file only\n---\n\nContent...\n```\n\n### layouts\n\n- Type: `Layout[]`\n- Default: `undefined`\n\nSpecifies a custom layout array.\n\nLayout component serves as a wrapper for the markdown files, which means the page content is displayed via the component's children prop.\n\n- **Lifecycle:** `plugins` → `layout.plugins` → `entry.plugins`\n\n```ts\nsvelteMarkdown({\n  layouts: [\n    {\n      name: 'default',\n      path: 'lib/content/layouts/default/layout.svelte', // Specifies the path to the layout file (required).\n      plugins: {\n        remark: [], // Specifies custom `remark` plugins at the layout-level (optional).\n        rehype: [], // Specifies custom `rehype` plugins at the layout-level (optional).\n      },\n    },\n    {\n      name: 'blog',\n      path: 'lib/content/layouts/blog/layout.svelte',\n    },\n  ],\n})\n```\n\nCan be enabled at the **top-level** (via config) or at the **file-level** (via frontmatter).\n\n**File-level**\n\n```markdown\n---\ntitle: Page title\nlayout: blog\n---\n\nContent...\n```\n\nAlso, layout plugins can be disabled at the **file-level**:\n\n```markdown\n---\ntitle: Page title\nlayout:\n  name: blog\n  plugins:\n    remark: false # Disables remark layout plugins for this file only\n    rehype: false # Disables rehype layout plugins for this file only\n---\n\nContent...\n```\n\n**Config**\n\n```ts\nsvelteMarkdown({\n  frontmatter: {\n    defaults: {\n      layout: 'default',\n    },\n  },\n})\n```\n\n### entries\n\n- Type: `Entry[]`\n- Default: `undefined`\n\nSpecifies a custom entry array.\n\nEntry serves as a special configuration for markdown files, which means it is similar to layout but without the need to create a custom component file.\n\nAllows unique and straightforward customization for an individual markdown file. An entry can be a page or a component.\n\n- **Lifecycle:** `plugins` → `layout.plugins` → `entry.plugins`\n\n```ts\nsvelteMarkdown({\n  entries: [\n    {\n      name: 'blog',\n      plugins: {\n        remark: [], // Specifies custom `remark` plugins at the entry-level (optional).\n        rehype: [], // Specifies custom `rehype` plugins at the entry-level (optional).\n      },\n    },\n  ],\n})\n```\n\nCan be enabled at the **top-level** (via config) or at the **file-level** (via frontmatter).\n\n**File-level**\n\n```markdown\n---\ntitle: Page title\nentry: blog\n---\n\nContent...\n```\n\nAlso, entry plugins can be disabled at the **file-level**:\n\n```markdown\n---\ntitle: Page title\nentry:\n  name: blog\n  plugins:\n    remark: false # Disables remark entry plugins for this file only\n    rehype: false # Disables rehype entry plugins for this file only\n---\n\nContent...\n```\n\n**Config**\n\n```ts\nsvelteMarkdown({\n  frontmatter: {\n    defaults: {\n      entry: 'default',\n    },\n  },\n})\n```\n\n### components\n\n- Type: `Component[]`\n- Default: `undefined`\n\nDefines global components that can be used in all markdown files without manual setup.\n\nEspecially useful for some generic components like buttons, links, images, etc.\n\n#### Default import\n\n```ts\nsvelteMarkdown({\n  components: [\n    {\n      name: 'GlobalButton', // Specifies the component name\n      path: 'src/components/button/Button.svelte', // Specifies the component path\n    },\n    // ...\n  ],\n})\n```\n\n```markdown\n---\ntitle: Home page\ndescription: Svelte Markdown Preprocessor.\n---\n\n\u003cGlobalButton\u003e\u003c/GlobalButton\u003e\n\nContent...\n```\n\n#### Named import\n\n```ts\nsvelteMarkdown({\n  components: [\n    {\n      name: 'Link', // Specifies named import\n      path: 'src/components/link/index.ts', // Specifies import path from the barrel file\n      form: 'named', // Specifies the component import form\n    },\n    {\n      name: 'Link as MainLink', // Specifies named alias\n      path: 'src/components/link/index.ts',\n      form: 'named',\n    },\n    {\n      name: 'Tabs',\n      path: 'npm-package', // Specifies import path from the external package\n      form: 'named',\n    },\n    // ...\n  ],\n})\n```\n\n```markdown\n---\ntitle: Docs page\ndescription: Get started with Svelte Markdown.\n---\n\n\u003cLink\u003e\u003c/Link\u003e\n\n\u003cMainLink\u003e\u003c/MainLink\u003e\n\n\u003cTabs\u003e\u003c/Tabs\u003e\n\nContent...\n```\n\n### frontmatter\n\n- Type: `object`\n- Default: `undefined`\n\nDefines frontmatter custom options.\n\nBy default, frontmatter only supports the `YAML` format, but allows additional customization via parser.\n\n#### defaults\n\n- Type: `Record\u003cstring, unknown\u003e`\n- Default: `undefined`\n\nSpecifies frontmatter global data to be applied to all markdown files.\n\n```ts\nsvelteMarkdown({\n  frontmatter: {\n    defaults: {\n      author: 'Sveltek',\n    },\n  },\n})\n```\n\n#### marker\n\n- Type: `string`\n- Default: `-`\n\nSpecifies the **start/end** symbols for the frontmatter content block.\n\nIt only works in combination with the default parser.\n\n```ts\nsvelteMarkdown({\n  frontmatter: {\n    marker: '+',\n  },\n})\n```\n\n#### parser\n\n- Type: `(value: string) =\u003e Record\u003cstring, unknown\u003e | void`\n- Default: `undefined`\n\nSpecifies a custom parser for frontmatter.\n\nAllows adaptation to other formats such as `TOML` or `JSON`.\n\n```ts\nsvelteMarkdown({\n  frontmatter: {\n    parser: (file) =\u003e {\n      // ...\n    },\n  },\n})\n```\n\n### highlight\n\n- Type: `object`\n- Default: `undefined`\n\nDefines custom syntax highlighting options.\n\n#### highlighter\n\n- Type: `(data: HighlightData) =\u003e Promise\u003cstring | undefined\u003e | string | undefined`\n- Default: `undefined`\n\nSpecifies custom syntax highlighter.\n\n```ts\nsvelteMarkdown({\n  highlight: {\n    highlighter: async ({ lang, meta, code }) =\u003e {\n      // ...\n      return code\n    },\n  },\n})\n```\n\n### specialElements\n\n- Type: `boolean`\n- Default: `undefined`\n\nSpecifies support for parsing Svelte `special` elements such as [`svelte:head`](https://svelte.dev/docs/svelte/svelte-head) etc. in markdown files.\n\nCan be enabled at the **top-level** (via config) or at the **file-level** (via frontmatter).\n\nIf you don't plan to use them in every markdown file, it is recommended to enable the option only on those pages where you really need it.\n\n**File-level**\n\n```markdown\n---\ntitle: Page title\nspecialElements: true\n---\n\n\u003csvelte:head\u003e...\u003c/svelte:head\u003e\n\nContent...\n```\n\n**Config**\n\n```ts\nsvelteMarkdown({\n  frontmatter: {\n    defaults: {\n      specialElements: true,\n    },\n  },\n})\n```\n\n## Credits\n\n- Inspired by [MDsveX](https://github.com/pngwn/MDsveX)\n\n## Contribute\n\nCheck out the quick [guide](.github/CONTRIBUTING.md) for more info.\n\n## License\n\nDeveloped in 🇭🇷 Croatia, © Sveltek.\n\nReleased under the [MIT](LICENSE.txt) license.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsveltek%2Fmarkdown","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsveltek%2Fmarkdown","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsveltek%2Fmarkdown/lists"}