{"id":13726351,"url":"https://github.com/phuctm97/ntast","last_synced_at":"2025-05-07T21:32:12.809Z","repository":{"id":41051481,"uuid":"336783426","full_name":"phuctm97/ntast","owner":"phuctm97","description":"Notion Abstract Syntax Tree specification.","archived":true,"fork":false,"pushed_at":"2023-02-13T12:57:09.000Z","size":1275,"stargazers_count":126,"open_issues_count":2,"forks_count":10,"subscribers_count":4,"default_branch":"master","last_synced_at":"2024-08-04T01:28:49.200Z","etag":null,"topics":["notion","ntast","spec","specification","syntax-tree","typescript","unified","unist"],"latest_commit_sha":null,"homepage":"https://notiontweet.app","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"cc-by-4.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/phuctm97.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,"governance":null,"roadmap":null,"authors":null}},"created_at":"2021-02-07T12:39:45.000Z","updated_at":"2024-05-11T02:39:44.000Z","dependencies_parsed_at":"2024-01-06T02:03:55.909Z","dependency_job_id":"7c58d8a0-3b53-43a4-a38a-107c679d804c","html_url":"https://github.com/phuctm97/ntast","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phuctm97%2Fntast","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phuctm97%2Fntast/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phuctm97%2Fntast/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phuctm97%2Fntast/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/phuctm97","download_url":"https://codeload.github.com/phuctm97/ntast/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224654232,"owners_count":17347701,"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":["notion","ntast","spec","specification","syntax-tree","typescript","unified","unist"],"created_at":"2024-08-03T01:03:00.631Z","updated_at":"2024-11-14T16:33:42.725Z","avatar_url":"https://github.com/phuctm97.png","language":null,"readme":"# ![ntast][banner]\n\n**N**o**t**ion **A**bstract **S**yntax **T**ree.\n\n\u003e by [Notion Tweet].\n\n---\n\n**ntast** is a specification for representing [**Notion contents**][notion] as\n[**abstract syntax trees**][syntax-tree]. It implements the [**unist**][unist]\nspecification. It can represent different types of pages in Notion:\n[Page][notion-page], [Table][notion-table], [Board][notion-board],\n[List][notion-list], [Calendar][notion-calendar], [Gallery][notion-gallery], and\n[Timeline][notion-timeline].\n\n## Contents\n\n- [Introduction](#introduction)\n  - [Where this specification fits](#where-this-specification-fits)\n  - [What this specification isn't about](#what-this-specification-isnt-about)\n- [Nodes](#nodes)\n  - [`Block`](#block)\n  - [`Parent`](#parent)\n  - [`Literal`](#literal)\n  - [`Page`](#page)\n  - [`Text`](#text)\n  - [`ToDo`](#todo)\n  - [`Heading1`](#heading1)\n  - [`Heading2`](#heading2)\n  - [`Heading3`](#heading3)\n  - [`BulletedList`](#bulletedlist)\n  - [`NumberedList`](#numberedlist)\n  - [`ToggleList`](#togglelist)\n  - [`Quote`](#quote)\n  - [`Divider`](#divider)\n  - [`LinkToPage`](#linktopage)\n  - [`Callout`](#callout)\n  - [`Image`](#image)\n- [Content formats](#content-formats)\n  - [`Value`](#value)\n  - [`TextValue`](#textvalue)\n  - [`ReferenceValue`](#referencevalue)\n  - [`EquationValue`](#equationvalue)\n- [Acknowledgements](#acknowledgements)\n- [Contributors](#contributors)\n- [Related projects](#related-projects)\n- [License](#license)\n\n## Introduction\n\nThis document defines a format, written in [TypeScript], for representing\n[Notion contents][notion] as [abstract syntax trees][syntax-tree].\n\n### Where this specification fits\n\nntast extends [unist], a format for syntax trees, to benefit from [its ecosystem\nof utilities][unist-utils], [unified], and [unified ecosystem].\n\nntast relates to [Notion] in that it enables reading from, applying\ntransformations, and writing to Notion. It has a set of utilities to transform\nbetween ntast syntax trees and Notion API schemas.\n\nntast relates to [JavaScript] in that it has an ecosystem of utilities for\nworking with compliant syntax trees in JavaScript. However, ntast is not limited\nto JavaScript and can be used in other programming languages.\n\n### What this specification isn't about\n\nntast focuses on only content and doesn't work with Notion-application data,\nsuch as _Workspaces_, _Accounts_, _Members_, _Permissions_, and similar\nsettings. Ecosystem plugins may extend functionalities for these data using\nNotion API.\n\n## Nodes\n\n### `Block`\n\n```ts\ninterface Block extends UnistNode {\n  id: string;\n}\n```\n\n**Block** ([**UnistNode**][unist-node]) represents a node in ntast and [a\ncontent block in Notion][notion-block].\n\nEach block has a unique `id`.\n\nExample:\n\n```js\n{\n  id: \"b3e6e681-2eaa-4f1a-89c4-dde7f7f7a167\",\n  type: \"text\",\n};\n```\n\n### `Parent`\n\n```ts\ninterface Parent extends UnistParent {\n  children: Block[];\n}\n```\n\n**Parent** ([**UnistParent**][unist-parent]) represents a node in ntast\ncontaining other nodes (said to be [_children_][unist-child]).\n\nIts `children` are limited to only [**Block**(s)](#block).\n\n### `Literal`\n\n```ts\ninterface Literal extends UnistLiteral {\n  value: Value[];\n}\n```\n\n**Literal** ([**UnistLiteral**][unist-literal]) represents a node in ntast\ncontaining a value.\n\nIts `value` is an ordered list of [**Value object**(s)](#value).\n\n### `Page`\n\n```ts\ninterface Page extends Block, Parent, Literal {\n  type: \"page\";\n  icon?: string;\n  cover?: string;\n}\n```\n\n**Page** represents [a `Page` in Notion][notion-page].\n\nA page can be the [_root_][unist-root] of a [_tree_][unist-tree] or a\n[_child_][unist-child] of another page (known as a sub-page in Notion).\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"128\" src=\"images/subpage-0.png\"\u003e\u003c/p\u003e\n\nExample:\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"32\" src=\"images/subpage-1.png\"\u003e\u003c/p\u003e\n\nYields:\n\n```js\n{\n  id: \"b3e6e681-2eaa-4f1a-89c4-dde7f7f7a167\",\n  type: \"page\",\n  value: [[\"This is a subpage\"]],\n  icon: \"☺️\",\n  children: [],\n};\n```\n\n### `Text`\n\n```ts\ninterface Text extends Block, Literal {\n  type: \"text\";\n}\n```\n\n**Text** represents [a `Text` block in Notion][notion-basic-blocks].\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"128\" src=\"images/text-0.png\"\u003e\u003c/p\u003e\n\nExample:\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"32\" src=\"images/text-1.png\"\u003e\u003c/p\u003e\n\nYields:\n\n```js\n{\n  id: \"333f9503-77f2-45b3-92df-89e2094fb354\",\n  type: \"text\",\n  value: [\n    [\"Tools you're familiar with will just work: \"],\n    [\"bold\", [[\"b\"]]],\n    [\", \"],\n    [\"italic\", [[\"i\"], [\"b\"]]],\n    [\", \"],\n    [\"strikethrough\", [[\"s\"]]],\n    [\", \"],\n    [\"code\", [[\"c\"]]],\n    [\", and more.\"],\n  ],\n};\n```\n\n### `ToDo`\n\n```ts\ninterface ToDo extends Block, Literal {\n  type: \"to_do\";\n  checked: boolean;\n}\n```\n\n**ToDo** represents [a `To-do list` block in Notion][notion-basic-blocks].\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"128\" src=\"images/todo-0.png\"\u003e\u003c/p\u003e\n\nExample:\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"32\" src=\"images/todo-1.png\"\u003e\u003c/p\u003e\n\u003cp align=\"left\"\u003e\u003cimg height=\"32\" src=\"images/todo-2.png\"\u003e\u003c/p\u003e\n\nYields:\n\n```js\n[\n  {\n    id: \"8b3cfeed-c0da-451e-8f18-f7086c321979\",\n    type: \"to_do\",\n    value: [[\"This is a \"], [\"todo\", [[\"b\"]]], [\" item.\"]],\n  },\n  {\n    id: \"8b3cfeed-c0da-451e-8f18-f7086c321979\",\n    type: \"to_do\",\n    value: [[\"This is a \"], [\"todo\", [[\"b\"]]], [\" item.\"]],\n    checked: true,\n  },\n];\n```\n\n### `Heading1`\n\n```ts\ninterface Heading1 extends Block, Literal {\n  type: \"header\";\n}\n```\n\n**Heading1** represents [a `Heading 1` block in Notion][notion-basic-blocks].\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"128\" src=\"images/h1-0.png\"\u003e\u003c/p\u003e\n\nExample:\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"48\" src=\"images/h1-1.png\"\u003e\u003c/p\u003e\n\nYields:\n\n```js\n{\n  id: \"f694bbd6-8fa4-44d4-b02c-ad05128fb277\",\n  type: \"header\",\n  value: [[\"This is heading 1\"]],\n};\n```\n\n### `Heading2`\n\n```ts\ninterface Heading2 extends Block, Literal {\n  type: \"sub_header\";\n}\n```\n\n**Heading2** represents [a `Heading 2` block in Notion][notion-basic-blocks].\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"128\" src=\"images/h2-0.png\"\u003e\u003c/p\u003e\n\nExample:\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"38\" src=\"images/h2-1.png\"\u003e\u003c/p\u003e\n\nYields:\n\n```js\n{\n  id: \"f694bbd6-8fa4-44d4-b02c-ad05128fb277\",\n  type: \"sub_header\",\n  value: [[\"This is heading 2\"]],\n};\n```\n\n### `Heading3`\n\n```ts\ninterface Heading3 extends Block, Literal {\n  type: \"sub_sub_header\";\n}\n```\n\n**Heading3** represents [a `Heading 3` block in Notion][notion-basic-blocks].\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"128\" src=\"images/h3-0.png\"\u003e\u003c/p\u003e\n\nExample:\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"28\" src=\"images/h3-1.png\"\u003e\u003c/p\u003e\n\nYields:\n\n```js\n{\n  id: \"f694bbd6-8fa4-44d4-b02c-ad05128fb277\",\n  type: \"sub_sub_header\",\n  value: [[\"This is heading 3\"]],\n};\n```\n\n### `BulletedList`\n\n```ts\ninterface BulletedList extends Block, Literal, Parent {\n  type: \"bulleted_list\";\n}\n```\n\n**BulletedList** represents [a `Bulleted list` block in\nNotion][notion-basic-blocks]. It can have children.\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"128\" src=\"images/ul-0.png\"\u003e\u003c/p\u003e\n\nExample:\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"110\" src=\"images/ul-1.png\"\u003e\u003c/p\u003e\n\nYields:\n\n```js\n[\n  {\n    id: \"dd130b72-3d53-42ea-bf3b-45e95c8e8c2d\",\n    type: \"bulleted_list\",\n    value: [\n      [\"Heading 1\", [[\"c\"]]],\n      [\": The largest heading, can be easily added with shortcut \"],\n      [\"/h1\", [[\"c\"]]],\n      [\".\"],\n    ],\n    children: [],\n  },\n  {\n    id: \"093db819-617f-47b0-b776-48abf0ff2792\",\n    type: \"bulleted_list\",\n    value: [\n      [\"Heading 2\", [[\"c\"]]],\n      [\": The medium-sized heading, can be easily added with shortcut \"],\n      [\"/h2\", [[\"c\"]]],\n      [\".\"],\n    ],\n    children: [],\n  },\n  {\n    id: \"b7d35804-e262-4d99-b039-8372470262f6\",\n    type: \"bulleted_list\",\n    value: [\n      [\"Heading 3\", [[\"c\"]]],\n      [\": The smallest heading, can be easily added with shortcut \"],\n      [\"/h3\", [[\"c\"]]],\n      [\".\"],\n    ],\n    children: [],\n  },\n];\n```\n\n## `NumberedList`\n\n```ts\ninterface NumberedList extends Block, Literal, Parent {\n  type: \"numbered_list\";\n}\n```\n\n**NumberedList** represents [a `Numbered list` block in\nNotion][notion-basic-blocks]. It can have children.\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"128\" src=\"images/ol-0.png\"\u003e\u003c/p\u003e\n\nExample:\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"110\" src=\"images/ol-1.png\"\u003e\u003c/p\u003e\n\nYields:\n\n```js\n[\n  {\n    id: \"a405f18e-978e-4c80-9055-1def35f84b47\",\n    type: \"numbered_list\",\n    value: [[\"This is an item\"]],\n    children: [],\n  },\n  {\n    id: \"385a10b8-f1fa-49b0-a704-02a109c92953\",\n    type: \"numbered_list\",\n    value: [[\"This is the second item\"]],\n    children: [],\n  },\n  {\n    id: \"8c6225e1-78b1-4e8d-b658-adc6e2b045ea\",\n    type: \"numbered_list\",\n    value: [[\"This is the third item\"]],\n    children: [],\n  },\n];\n```\n\n## `ToggleList`\n\n```ts\ninterface ToggleList extends Block, Literal, Parent {\n  type: \"toggle\";\n}\n```\n\n**ToggleList** represents [a `Toggle list` block in\nNotion][notion-basic-blocks]. It can have children.\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"128\" src=\"images/toggle-0.png\"\u003e\u003c/p\u003e\n\nExample:\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"64\" src=\"images/toggle-1.png\"\u003e\u003c/p\u003e\n\nYields:\n\n```js\n{\n  id: \"edf810ae-1684-491d-a6c1-673ad2d3fc57\",\n  type: \"toggle\",\n  value: [[\"This is a \"], [\"toggle\", [[\"b\"]]], [\" \"], [\"list\", [[\"i\"]]]],\n  children: [\n    {\n      id: \"689aa04d-d448-48b2-93fa-edbcc93c34d8\",\n      type: \"text\",\n      value: [[\"This is a child block.\"]],\n    },\n  ],\n};\n```\n\n### `Quote`\n\n```ts\ninterface Quote extends Block, Literal {\n  type: \"quote\";\n}\n```\n\n**Quote** represents [a `Quote` block in Notion][notion-basic-blocks].\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"128\" src=\"images/quote-0.png\"\u003e\u003c/p\u003e\n\nExample:\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"32\" src=\"images/quote-1.png\"\u003e\u003c/p\u003e\n\nYields:\n\n```js\n{\n  id: \"d3a9da64-26e3-44b3-a22a-99a6b02880d3\",\n  type: \"quote\",\n  value: [\n    [\n      '\"The way to get started is to quit talking and begin doing.\" - Walt Disney',\n    ],\n  ],\n};\n```\n\n### `Divider`\n\n```ts\ninterface Divider extends Block {\n  type: \"divider\";\n}\n```\n\n**Divider** represents [a `Divider` block in Notion][notion-basic-blocks]. It\nhas no content.\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"128\" src=\"images/divider-0.png\"\u003e\u003c/p\u003e\n\nYields:\n\n```js\n{\n  id: \"95ee567a-527f-4020-aa6a-e4c170de031c\",\n  type: \"divider\",\n};\n```\n\n### `LinkToPage`\n\n```ts\ntype LinkToPage = Page;\n```\n\n**LinkToPage** represents [a `Link to page` block in\nNotion][notion-basic-blocks]. It is an alias to [**Page**](#page).\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"128\" src=\"images/link-to-page-0.png\"\u003e\u003c/p\u003e\n\n### `Callout`\n\n```ts\ninterface Callout extends Block, Literal {\n  type: \"callout\";\n  icon: string;\n  color: Color;\n}\n```\n\n**Callout** represents [a `Callout` block in Notion][notion-callout].\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"128\" src=\"images/callout-0.png\"\u003e\u003c/p\u003e\n\nExample:\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"64\" src=\"images/callout-1.png\"\u003e\u003c/p\u003e\n\nYields:\n\n```js\n{\n  id: \"5cc11b17-3ee0-4f09-8cca-659e56851db7\",\n  type: \"callout\",\n  value: [[\"Please read this first\"]],\n  icon: \"💡\",\n  color: \"gray_background\",\n};\n```\n\n### `Image`\n\n```ts\ninterface Image extends Block {\n  type: \"image\";\n  source: string[][];\n}\n```\n\n**Image** represents [a `Image` block in Notion][notion-basic-blocks].\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"128\" src=\"images/image-0.png\"\u003e\u003c/p\u003e\n\nExample:\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"128\" src=\"images/image-1.png\"\u003e\u003c/p\u003e\n\u003cp align=\"left\"\u003e\u003cimg height=\"128\" src=\"images/image-2.png\"\u003e\u003c/p\u003e\n\nYields:\n\n```js\n[\n  {\n    id: \"8b3cfeed-c0da-451e-8f18-f7086c321979\",\n    type: \"image\",\n    source: [\n      [\n        \"https://cdn.iconscout.com/icon/free/png-256/notion-1693557-1442598.png\",\n      ],\n    ],\n  },\n];\n```\n\n## Content formats\n\n### `Value`\n\n```ts\ntype Value = TextValue | ReferenceValue | EquationValue;\n```\n\n**Value** represents an inline literal in Notion, which can be either\n[**text**](#textvalue), or [**reference**](#referencevalue), or\n[**equation**](#equationvalue).\n\n### `TextValue`\n\n```ts\ntype TextValue = [string, TextFormat[]?];\n\ntype TextFormat =\n  | BoldFormat\n  | ItalicFormat\n  | StrikethroughFormat\n  | CodeFormat\n  | UnderlineFormat\n  | LinkFormat\n  | HighlightFormat;\n\ntype BoldFormat = [\"b\"];\ntype ItalicFormat = [\"i\"];\ntype StrikethroughFormat = [\"s\"];\ntype CodeFormat = [\"c\"];\ntype UnderlineFormat = [\"_\"];\ntype LinkFormat = [\"a\", string];\ntype HighlightFormat = [\"h\", Color];\n\ntype Color =\n  | \"gray\"\n  | \"brown\"\n  | \"orange\"\n  | \"yellow\"\n  | \"teal\"\n  | \"blue\"\n  | \"purple\"\n  | \"pink\"\n  | \"red\"\n  | \"gray_background\"\n  | \"brown_background\"\n  | \"orange_background\"\n  | \"yellow_background\"\n  | \"teal_background\"\n  | \"blue_background\"\n  | \"purple_background\"\n  | \"pink_background\"\n  | \"red_background\";\n```\n\n**TextValue** represents a text literal in Notion, which can have [styling\noptions][notion-styling].\n\nExample:\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"64\" src=\"images/format-0.png\"\u003e\u003c/p\u003e\n\nYields:\n\n```js\n[\n  [\"All the usual shortcuts apply, like \"],\n  [\"cmd/ctrl\", [[\"c\"]]],\n  [\" + \"],\n  [\"b\", [[\"c\"]]],\n  [\" for \"],\n  [\"bold\", [[\"b\"]]],\n  [\" and \"],\n  [\"cmd/ctrl\", [[\"c\"]]],\n  [\" + \"],\n  [\"shift\", [[\"c\"]]],\n  [\" + \"],\n  [\"s\", [[\"c\"]]],\n  [\" for \"],\n  [\"strikethrough\", [[\"s\"]]],\n  [\". Our shortcuts for writing live \"],\n  [\n    \"here\",\n    [\n      [\n        \"a\",\n        \"https://notion.so/notion/Keyboard-Markdown-Shortcuts-66e28cec810548c3a4061513126766b0\",\n      ],\n      [\"h\", \"red\"],\n    ],\n  ],\n  [\" ✂️ But we've thrown in a couple others.\"],\n];\n```\n\n### `ReferenceValue`\n\n```ts\ntype ReferenceValue = [\"‣\", ReferenceFormat[]?];\n\ntype ReferenceFormat = UserFormat | PageFormat | DateFormat;\n\ntype UserFormat = [\"u\", string];\ntype PageFormat = [\"p\", string];\ntype DateFormat = [\n  \"d\",\n  {\n    type: \"date\" | \"daterange\";\n    start: string;\n    end?: string;\n    format?: string;\n  }\n];\n```\n\n**ReferenceValue** represents a reference literal in Notion.\n\nExample:\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"64\" src=\"images/format-1.png\"\u003e\u003c/p\u003e\n\nYields:\n\n```js\n[\n  // Others...\n  [\", page \"],\n  [\"‣\", [[\"p\", \"57dcb2ae-4528-4939-8207-9ed5d1e01809\"]]],\n  [\", user \"],\n  [\"‣\", [[\"u\", \"62e85506-1758-481a-92b1-73984a903451\"]]],\n  [\" and even date \"],\n  [\n    \"‣\",\n    [\n      [\n        \"d\",\n        {\n          type: \"date\",\n          start_date: \"2021-02-18\",\n          date_format: \"relative\",\n        },\n      ],\n    ],\n  ],\n  [\".\"],\n];\n```\n\n### `EquationValue`\n\n```ts\ntype EquationValue = [\"⁍\", EquationFormat[]?];\n\ntype EquationFormat = [\"e\", string];\n```\n\n**EquationValue** represent an equation literal in Notion.\n\nExample:\n\n\u003cp align=\"left\"\u003e\u003cimg height=\"64\" src=\"images/format-1.png\"\u003e\u003c/p\u003e\n\nYields:\n\n```js\n[\n  [\"You can embed inline equation \"],\n  [\"⁍\", [[\"e\", \"e = mc^2\"]]],\n  // Others...\n];\n```\n\n## Acknowledgements\n\nntast is created and maintained by the creator of [Notion Tweet].\n\n\u003e [Notion Tweet] is a tool that enables writing, scheduling, and automating your\n\u003e tweets 10x easier and faster, directly in Notion.\n\nSpecial thanks to [@wooorm](https://github.com/wooorm) for his work on [unist],\n[mdast], and [unified], by which this project is heavily inspired.\n\n## Contributors\n\n- [Minh-Phuc Tran][@phuctm97]\n- [Safwan Shaheer](https://github.com/Devorein)\n\n## Related projects\n\n- [Nishan](https://github.com/Devorein/Nishan)\n- [react-notion-x](https://github.com/NotionX/react-notion-x)\n\n## License\n\n[CC-BY-4.0](/LICENSE) © [Minh-Phuc Tran][@phuctm97].\n\n\u003c!-- Definitions --\u003e\n\n[@phuctm97]: https://twitter.com/phuctm97\n[banner]: /banner.svg\n[notion tweet]: https://notiontweet.app\n[notion]: https://notion.so\n[unified]: https://github.com/unifiedjs/unified\n[unified api]: https://github.com/unifiedjs/unified#description\n[unified ecosystem]: https://unifiedjs.com/explore\n[syntax-tree]: https://github.com/syntax-tree/unist#syntax-tree\n[unist]: https://github.com/syntax-tree/unist\n[mdast]: https://github.com/syntax-tree/mdast\n[javascript]: https://developer.mozilla.org/en-US/docs/Web/JavaScript\n[typescript]: https://www.typescriptlang.org\n[notion-page]:\n  https://www.notion.so/Create-a-new-page-6c3fe9aad94749099ea4bdfc072e5f97\n[notion-table]:\n  https://www.notion.so/Intro-to-databases-fd8cd2d212f74c50954c11086d85997e#619bd05f7a004dd586aa6625688e9b02\n[notion-board]:\n  https://www.notion.so/Intro-to-databases-fd8cd2d212f74c50954c11086d85997e#2a6fd1048c554fc5867e984a65f81b5c\n[notion-list]:\n  https://www.notion.so/Intro-to-databases-fd8cd2d212f74c50954c11086d85997e#43004898727e439bbbc4973251c97888\n[notion-calendar]:\n  https://www.notion.so/Intro-to-databases-fd8cd2d212f74c50954c11086d85997e#ad61402f93a84d0fad0d833b09f46610\n[notion-gallery]:\n  https://www.notion.so/Intro-to-databases-fd8cd2d212f74c50954c11086d85997e#5f5e4e9b5a534445bb1f941093ada5d9\n[notion-timeline]:\n  https://www.notion.so/Intro-to-databases-fd8cd2d212f74c50954c11086d85997e#184b7b79134647f3a5c5ad3f01f20730\n[notion-block]:\n  https://www.notion.so/Writing-editing-basics-68c7c67047494fdb87d50185429df93e#8c31584e7c514630b9ebb86afe1125b1\n[notion-basic-blocks]:\n  https://www.notion.so/Writing-editing-basics-68c7c67047494fdb87d50185429df93e#73916b435b674a85b10a165e96d1114e\n[notion-callout]:\n  https://www.notion.so/Callout-blocks-5b2638247b54447eb2e21145f97194b0\n[notion-inline]:\n  https://www.notion.so/Writing-editing-basics-68c7c67047494fdb87d50185429df93e#7a4ade361ccc4ce881df56036f125e0d\n[notion-styling]:\n  https://www.notion.so/Writing-editing-basics-68c7c67047494fdb87d50185429df93e#7527efecd76a458bba251c267209a5c2\n[unist-utils]: https://github.com/syntax-tree/unist#list-of-utilities\n[unist-node]: https://github.com/syntax-tree/unist#node\n[unist-parent]: https://github.com/syntax-tree/unist#parent\n[unist-child]: https://github.com/syntax-tree/unist#child\n[unist-literal]: https://github.com/syntax-tree/unist#literal\n[unist-root]: https://github.com/syntax-tree/unist#root\n[unist-tree]: https://github.com/syntax-tree/unist#tree\n[mdast-paragraph]: https://github.com/syntax-tree/mdast#paragraph\n[mdast-thematicbreak]: https://github.com/syntax-tree/mdast#thematicbreak\n[mdast-list]: https://github.com/syntax-tree/mdast#list\n","funding_links":[],"categories":["Others"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphuctm97%2Fntast","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fphuctm97%2Fntast","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphuctm97%2Fntast/lists"}