├── .github └── workflows │ └── notion2github.yml ├── .gitignore ├── .vscode └── settings.json ├── Dockerfile ├── LICENSE ├── README.md ├── action.yml ├── docs ├── README.ko.md └── images │ ├── logo.png │ ├── readme-image-0.png │ └── readme-image-1.png ├── main.py ├── narkdown.config.json └── requirements.txt /.github/workflows/notion2github.yml: -------------------------------------------------------------------------------- 1 | name: Notion2Github 2 | on: 3 | push: 4 | branches: 5 | - 'test/**' 6 | jobs: 7 | auto-sync-from-notion-to-github: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - name: Checkout code 11 | uses: actions/checkout@v2 12 | 13 | - name: Notion2Github 14 | uses: younho9/notion2github@main 15 | with: 16 | database-url: 'https://www.notion.so/acc3dfd0339e4cacb5baae8673fddfad' 17 | docs-directory: docs/test 18 | # filter-prop: Category 19 | # filter-value: Test 20 | env: 21 | NOTION_TOKEN: ${{ secrets.NOTION_TOKEN }} 22 | 23 | - name: Format documents 24 | uses: creyD/prettier_action@v3.1 25 | with: 26 | prettier_options: --write ./docs/**/*.md 27 | commit_message: 'docs: Update docs (auto)' 28 | env: 29 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 30 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | share/python-wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .nox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | *.py,cover 50 | .hypothesis/ 51 | .pytest_cache/ 52 | cover/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | .pybuilder/ 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | # For a library or package, you might want to ignore these files since the code is 87 | # intended to run in multiple environments; otherwise, check them in: 88 | # .python-version 89 | 90 | # pipenv 91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 94 | # install all needed dependencies. 95 | #Pipfile.lock 96 | 97 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 98 | __pypackages__/ 99 | 100 | # Celery stuff 101 | celerybeat-schedule 102 | celerybeat.pid 103 | 104 | # SageMath parsed files 105 | *.sage.py 106 | 107 | # Environments 108 | .env 109 | .venv 110 | env/ 111 | venv/ 112 | ENV/ 113 | env.bak/ 114 | venv.bak/ 115 | 116 | # Spyder project settings 117 | .spyderproject 118 | .spyproject 119 | 120 | # Rope project settings 121 | .ropeproject 122 | 123 | # mkdocs documentation 124 | /site 125 | 126 | # mypy 127 | .mypy_cache/ 128 | .dmypy.json 129 | dmypy.json 130 | 131 | # Pyre type checker 132 | .pyre/ 133 | 134 | # pytype static type analyzer 135 | .pytype/ 136 | 137 | # Cython debug symbols 138 | cython_debug/ 139 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.tabSize": 4, 3 | "editor.formatOnSave": true, 4 | "python.formatting.provider": "black" 5 | } 6 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.8-slim 2 | 3 | LABEL "com.github.actions.name"="Notion2Github" 4 | LABEL "com.github.actions.description"="Automatic syncronization from Notion to Github" 5 | LABEL "repository"="https://github.com/younho9/notion2github" 6 | LABEL "maintainer"="Younho Choo " 7 | 8 | WORKDIR /usr/src/app 9 | 10 | COPY requirements.txt main.py $GITHUB_WORKSPACE/narkdown.config.json* ./ 11 | 12 | RUN pip install -r requirements.txt 13 | 14 | ENTRYPOINT ["python", "/usr/src/app/main.py"] 15 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Younho Choo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Notion2Github 2 | 3 | # Notion2Github 4 | 5 | [![GitHub Action: View on Marketplace](https://img.shields.io/badge/GitHub%20Action-View_on_Marketplace-blue?style=flat-square&logo=github)](https://github.com/marketplace/actions/notion2github) 6 | [![Demo: available](https://img.shields.io/badge/Demo-available-orange?style=flat-square)](.github/workflows/notion2github.yml) 7 | [![Version: v1.0.1](https://img.shields.io/badge/Version-v1.0.1-brightgreen?style=flat-square)](https://github.com/younho9/notion2github/releases/tag/v1.0.1) 8 | [![license: MIT](https://img.shields.io/badge/license-MIT-yellow.svg?style=flat-square)](./LICENSE) 9 | 10 | | [English](/README.md) | [한국어](/docs/README.ko.md) | 11 | 12 | **Automatic syncronization from Notion to Github** 13 | 14 | --- 15 | 16 | > ⚠️ **NOTE:** Narkdown is dependent on [notion-py](https://github.com/jamalex/notion-py), the **_unofficial_** Notion API created by [Jamie Alexandre](https://github.com/jamalex). 17 | > It can not gurantee it will stay stable. If you need to use in production, I recommend waiting for their official release. 18 | 19 | --- 20 | 21 | ## Usage 22 | 23 | ### Quick Start 24 | 25 | 1. Go to `github.com/{your_id}/{your_repo}/settings/secrets/actions` 26 | 27 | 2. Set `token_v2` of Notion to your repository secret. 28 | 29 | ![notion2github-image-0](docs/images/readme-image-0.png) 30 | 31 | [How To Find Your Notion v2 Token - Red Gregory](https://www.redgregory.com/notion/2020/6/15/9zuzav95gwzwewdu1dspweqbv481s5) 32 | 33 | [Encrypted secrets](https://docs.github.com/en/free-pro-team@latest/actions/reference/encrypted-secrets#using-encrypted-secrets-in-a-workflow) 34 | 35 | 3. Create a workflow in `.github/workflows/**.yml` of your repository 36 | 37 | Here are examples. 38 | 39 | ### Example Workflow 40 | 41 | #### Example 1 (run on push & pull request in main) 42 | 43 | ```yaml 44 | name: Notion2Github 45 | on: 46 | pull_request: 47 | push: 48 | branches: 49 | - main 50 | jobs: 51 | auto-sync-from-notion-to-github: 52 | runs-on: ubuntu-latest 53 | steps: 54 | - name: Checkout code 55 | uses: actions/checkout@v2 56 | 57 | - name: Notion2Github 58 | uses: younho9/notion2github@v1.1.0 59 | with: 60 | database-url: 'https://www.notion.so/acc3dfd0339e4cacb5baae8673fddfad' 61 | docs-directory: docs 62 | env: 63 | NOTION_TOKEN: ${{ secrets.NOTION_TOKEN }} 64 | 65 | - name: Format documents 66 | uses: creyD/prettier_action@v3.1 67 | with: 68 | prettier_options: --write ./docs/**/*.md 69 | commit_message: 'docs: Update docs (auto)' 70 | env: 71 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 72 | ``` 73 | 74 | #### Example 2 (scheduled) 75 | 76 | ```yaml 77 | name: Notion2Github 78 | on: 79 | schedule: 80 | - cron: '0 14 * * *' 81 | jobs: 82 | auto-sync-from-notion-to-github: 83 | runs-on: ubuntu-latest 84 | steps: 85 | - name: Checkout code 86 | uses: actions/checkout@v2 87 | 88 | - name: Notion2Github 89 | uses: younho9/notion2github@v1.1.0 90 | with: 91 | database-url: 'https://www.notion.so/acc3dfd0339e4cacb5baae8673fddfad' 92 | docs-directory: docs 93 | env: 94 | NOTION_TOKEN: ${{ secrets.NOTION_TOKEN }} 95 | 96 | - name: Format documents 97 | uses: creyD/prettier_action@v3.1 98 | with: 99 | prettier_options: --write ./docs/**/*.md 100 | commit_message: 'docs: Update docs (auto)' 101 | env: 102 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 103 | ``` 104 | 105 | > [Useful site for crontab setting](https://crontab.guru/) 106 | 107 | ### Live examples 108 | 109 | - [younho9/narkdown](https://github.com/younho9/narkdown/blob/main/.github/workflows/notion2github.yml) 110 | 111 | - [younho9/TIL](https://github.com/younho9/til/blob/main/.github/workflows/notion2github.yml) 112 | 113 | ## Database template page for test 114 | 115 | Here is an [database template page](https://www.notion.so/acc3dfd0339e4cacb5baae8673fddfad?v=be43c1c8dd644cfb9df9efd97d8af60a) for importing pages from the database. Move to that page, duplicate it, and test it. 116 | 117 |
118 | notion2github-image-1 119 |
120 | 121 | ## Configuration 122 | 123 | ### Parameters 124 | 125 | | Name | Description | Required | Default | 126 | | ---------------- | -------------------------------------------------------------- | ---------- | -------- | 127 | | `database-url` | URL of the Notion database to extract. | `required` | | 128 | | `docs-directory` | Directory in which the Notion pages to extract will be stored. | | `"docs"` | 129 | | `filter-prop` | Property of the filter to apply to the notion database. | | `""` | 130 | | `filter-value` | Value of the filter to apply to the notion database. | | `""` | 131 | 132 | ### Configuring Narkdown 133 | 134 | Narkdown provides some configuration for how to extract documents. You can configure Narkdown via `narkdown.config.json` . 135 | 136 | Create `narkdown.config.json` in root directory of your repository. 137 | 138 | For more information on configure your environment, [see the document in Nakdown](https://github.com/younho9/narkdown#configuring-narkdown). 139 | 140 | ```json 141 | // narkdown.config.json 142 | { 143 | "exportConfig": { 144 | "recursiveExport": true, 145 | "createPageDirectory": true, 146 | "addMetadata": true, 147 | "appendCreatedTime": true, 148 | "generateSlug": true 149 | }, 150 | "databaseConfig": { 151 | "categoryColumnName": "Category", 152 | "statusColumnName": "Status", 153 | "currentStatus": "✅ Completed", 154 | "nextStatus": "🖨 Published" 155 | } 156 | } 157 | ``` 158 | 159 | ### Used in combination with other actions 160 | 161 | Notion2Github is a step in the workflow, just import the contents of notion to a running virtual machine in github action. 162 | 163 | There are great actions to commit the imported content to your repository. 164 | 165 | - [Git Auto Commit - GitHub Marketplace](https://github.com/marketplace/actions/git-auto-commit) 166 | 167 | - [Prettier Action - GitHub Marketplace](https://github.com/marketplace/actions/prettier-action) 168 | 169 | ### License 170 | 171 | MIT © [younho9](https://github.com/younho9) 172 | -------------------------------------------------------------------------------- /action.yml: -------------------------------------------------------------------------------- 1 | name: Notion2Github 2 | author: Younho Choo 3 | description: Automatic syncronization from Notion to Github 4 | branding: 5 | icon: inbox 6 | color: black 7 | inputs: 8 | database-url: 9 | description: URL of the notion database to extract. 10 | required: true 11 | docs-directory: 12 | description: Directory in which the notion pages to extract will be stored. 13 | required: false 14 | default: 'docs' 15 | filter-prop: 16 | description: Property of the filter to apply to the notion database. 17 | required: false 18 | default: '' 19 | filter-value: 20 | description: Value of the filter to apply to the notion database. 21 | required: false 22 | default: '' 23 | 24 | runs: 25 | using: 'docker' 26 | image: 'Dockerfile' 27 | args: 28 | - --url 29 | - ${{ inputs.database-url }} 30 | - --docs-directory 31 | - ${{ inputs.docs-directory }} 32 | - --filter-prop 33 | - ${{ inputs.filter-prop }} 34 | - --filter-value 35 | - ${{ inputs.filter-value }} 36 | - --is-database 37 | -------------------------------------------------------------------------------- /docs/README.ko.md: -------------------------------------------------------------------------------- 1 | Notion2Github 2 | 3 | # Notion2Github 4 | 5 | [![GitHub Action: View on Marketplace](https://img.shields.io/badge/GitHub%20Action-View_on_Marketplace-blue?style=flat-square&logo=github)](https://github.com/marketplace/actions/notion2github) 6 | [![Demo: available](https://img.shields.io/badge/Demo-available-orange?style=flat-square)](.github/workflows/notion2github.yml) 7 | [![Version: v1.0.1](https://img.shields.io/badge/Version-v1.0.1-brightgreen?style=flat-square)](https://github.com/younho9/notion2github/releases/tag/v1.0.1) 8 | [![license: MIT](https://img.shields.io/badge/license-MIT-yellow.svg?style=flat-square)](./LICENSE) 9 | 10 | | [English](/README.md) | [한국어](/docs/README.ko.md) | 11 | 12 | **노션에서 깃헙으로의 자동 동기화** 13 | 14 | --- 15 | 16 | > ⚠️ **유의사항:** Notion2Github은 [Jamie Alexandre](https://github.com/jamalex)이 만든 **_비공식_** 노션 API인 [notion-py](https://github.com/jamalex/notion-py) 프로젝트에 의존하고 있습니다. 공식 API가 아니기 때문에 안정적이지 않을 수 있습니다. 프로덕션 환경에서 사용하고자 한다면, 노션 공식 API 출시를 기다리는 것을 권장합니다. 17 | 18 | --- 19 | 20 | ## 사용법 21 | 22 | ### 바로 시작하기 23 | 24 | 1. `github.com/{your_id}/{your_repo}/settings/secrets/actions` 으로 이동합니다. 25 | 26 | 1. 노션의 `token_v2` 를 레포지토리의 Secrets으로 설정합니다. 27 | 28 | ![notion2github-image-0](images/readme-image-0.png) 29 | 30 | [How To Find Your Notion v2 Token - Red Gregory](https://www.redgregory.com/notion/2020/6/15/9zuzav95gwzwewdu1dspweqbv481s5) 31 | 32 | [Encrypted secrets](https://docs.github.com/en/free-pro-team@latest/actions/reference/encrypted-secrets#using-encrypted-secrets-in-a-workflow) 33 | 34 | 1. 레포지토리의 `.github/workflows/**.yml` 파일에 워크플로우를 생성합니다. 35 | 36 | 몇 가지 예시입니다. 37 | 38 | ### 워크플로우 예제 39 | 40 | #### 예제 1 (main 브랜치에 push & pull request 시에 실행) 41 | 42 | ```yaml 43 | name: Notion2Github 44 | on: 45 | pull_request: 46 | push: 47 | branches: 48 | - main 49 | jobs: 50 | auto-sync-from-notion-to-github: 51 | runs-on: ubuntu-latest 52 | steps: 53 | - name: Checkout code 54 | uses: actions/checkout@v2 55 | 56 | - name: Notion2Github 57 | uses: younho9/notion2github@v1.1.0 58 | with: 59 | database-url: 'https://www.notion.so/acc3dfd0339e4cacb5baae8673fddfad' 60 | docs-directory: docs 61 | env: 62 | NOTION_TOKEN: ${{ secrets.NOTION_TOKEN }} 63 | 64 | - name: Format documents 65 | uses: creyD/prettier_action@v3.1 66 | with: 67 | prettier_options: --write ./docs/**/*.md 68 | commit_message: 'docs: Update docs (auto)' 69 | env: 70 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 71 | ``` 72 | 73 | #### 예제 2 (정해진 시간에 실행) 74 | 75 | ```yaml 76 | name: Notion2Github 77 | on: 78 | schedule: 79 | - cron: '0 14 * * *' 80 | jobs: 81 | auto-sync-from-notion-to-github: 82 | runs-on: ubuntu-latest 83 | steps: 84 | - name: Checkout code 85 | uses: actions/checkout@v2 86 | 87 | - name: Notion2Github 88 | uses: younho9/notion2github@v1.1.0 89 | with: 90 | database-url: 'https://www.notion.so/acc3dfd0339e4cacb5baae8673fddfad' 91 | docs-directory: docs 92 | env: 93 | NOTION_TOKEN: ${{ secrets.NOTION_TOKEN }} 94 | 95 | - name: Format documents 96 | uses: creyD/prettier_action@v3.1 97 | with: 98 | prettier_options: --write ./docs/**/*.md 99 | commit_message: 'docs: Update docs (auto)' 100 | env: 101 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 102 | ``` 103 | 104 | > [크론탭 설정에 유용한 사이트](https://crontab.guru/) 105 | 106 | ### 실사용 예제 107 | 108 | - [younho9/narkdown](https://github.com/younho9/narkdown/blob/main/.github/workflows/notion2github.yml) 109 | 110 | - [younho9/TIL](https://github.com/younho9/til/blob/main/.github/workflows/notion2github.yml) 111 | 112 | ## 테스트를 위한 데이터베이스 템플릿 페이지 113 | 114 | 데이터베이스로부터 페이지들을 가져올 수 있는 [데이터베이스 템플릿 페이지](https://www.notion.so/acc3dfd0339e4cacb5baae8673fddfad?v=be43c1c8dd644cfb9df9efd97d8af60a)가 있습니다. 115 | 116 | 페이지로 이동해서 복제하고 테스트해볼 수 있습니다. 117 | 118 |
119 | notion2github-image-1 120 |
121 | 122 | ## 환경설정 123 | 124 | | Name | Description | Required | Default | 125 | | ---------------- | ------------------------------------------- | ---------- | -------- | 126 | | `database-url` | 추출할 노션 데이터베이스의 URL | `required` | | 127 | | `docs-directory` | 추출된 노션 페이지들이 저장될 디렉토리 | | `"docs"` | 128 | | `filter-prop` | 노션 데이터베이스에 적용할 필터의 속성 이름 | | `""` | 129 | | `filter-value` | 노션 데이터베이스에 적용할 필터의 값 이름 | | `""` | 130 | 131 | ### Narkdown 환경설정 132 | 133 | Narkdown은 문서들을 어떻게 추출할 것인지에 대해 몇가지 환경설정을 제공합니다. `narkdown.config.json` 파일을 통해서 Narkdown을 환경설정할 수 있습니다. 134 | 135 | 레포지토리의 root에 `narkdown.config.json` 파일을 생성하세요. 136 | 137 | 환경에 따라 환경설정하는 방법에 대한 더 많은 정보를 보려면 [Narkdown의 문서를 확인하세요](https://github.com/younho9/narkdown#configuring-narkdown). 138 | 139 | ```json 140 | // narkdown.config.json 141 | { 142 | "exportConfig": { 143 | "recursiveExport": true, 144 | "createPageDirectory": true, 145 | "addMetadata": true, 146 | "appendCreatedTime": true, 147 | "generateSlug": true 148 | }, 149 | "databaseConfig": { 150 | "categoryColumnName": "Category", 151 | "statusColumnName": "Status", 152 | "currentStatus": "✅ Completed", 153 | "nextStatus": "🖨 Published" 154 | } 155 | } 156 | ``` 157 | 158 | ### 다른 액션과 조합하여 사용 159 | 160 | Notion2Github은 워크플로우의 한 step으로 단지 github action으로 실행되는 가상 머신으로 노션의 콘텐츠들을 가져올 뿐입니다. 161 | 162 | 노션의 콘텐츠들을 레포지토리로 커밋할 수 있는 훌륭한 action들이 있습니다. 163 | 164 | - [Git Auto Commit - GitHub Marketplace](https://github.com/marketplace/actions/git-auto-commit) 165 | 166 | - [Prettier Action - GitHub Marketplace](https://github.com/marketplace/actions/prettier-action) 167 | 168 | ### License 169 | 170 | MIT © [younho9](https://github.com/younho9) 171 | -------------------------------------------------------------------------------- /docs/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narkdown/notion2github/8090143207848670f86430c3f29dc217782ed0c4/docs/images/logo.png -------------------------------------------------------------------------------- /docs/images/readme-image-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narkdown/notion2github/8090143207848670f86430c3f29dc217782ed0c4/docs/images/readme-image-0.png -------------------------------------------------------------------------------- /docs/images/readme-image-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narkdown/notion2github/8090143207848670f86430c3f29dc217782ed0c4/docs/images/readme-image-1.png -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | from narkdown.cli import main 2 | 3 | if __name__ == "__main__": 4 | main() 5 | -------------------------------------------------------------------------------- /narkdown.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "exportConfig": { 3 | "recursiveExport": true, 4 | "createPageDirectory": true, 5 | "addMetadata": true, 6 | "appendCreatedTime": true, 7 | "generateSlug": true 8 | }, 9 | "databaseConfig": { 10 | "categoryColumnName": "Category", 11 | "statusColumnName": "Status", 12 | "currentStatus": "✅ Completed", 13 | "nextStatus": "🖨 Published" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | narkdown 2 | --------------------------------------------------------------------------------