GithubHelp home page GithubHelp logo

enchant97 / note-mark Goto Github PK

View Code? Open in Web Editor NEW
260.0 2.0 6.0 1.05 MB

Note Mark is a lighting fast and minimal; web-based Markdown notes app.

Home Page: https://notemark.docs.enchantedcode.co.uk/

License: GNU Affero General Public License v3.0

JavaScript 0.11% CSS 0.19% Go 30.40% HTML 0.43% Makefile 0.04% TypeScript 68.13% Dockerfile 0.55% SCSS 0.03% Rust 0.13%
markdown notes notebook note-taking

note-mark's Introduction

Note Mark

License: AGPL V3 GitHub Latest Release

Note Mark is a lighting fast and minimal; web-based Markdown notes app. Featuring a sleek and responsive web UI.

Features

  • Markdown (GitHub Flavored Markdown, see spec here)
  • HTML sanitisation, minimizing XSS attacks
  • Mobile Friendly
  • Friendly URLs for cleaner links
  • Dark & Light Theme
  • Notebook Sharing
  • Custom flat-file based storage system
  • Multiple views for a note (rendered, plain)
  • Lighting fast editor with shortcuts
  • Upload and attach assets

Showcase

Preview Image Showing App

Demo Video

Demo Video

https://youtu.be/rwL99Ac5g98

Docs

Documentation is available here: notemark.docs.enchantedcode.co.uk.

Checkout here for the roadmap.

Support Me

Like this project? Consider supporting me financially so I can continue development.

Buy Me A Coffee

License

This project is Copyright (c) 2024 Leo Spratt, licences shown below:

Code

AGPL-3.0. Full license found in `LICENSE.txt`

Icon / Mark

All Rights Reserved

note-mark's People

Contributors

enchant97 avatar dependabot[bot] avatar jivanyatra avatar robviren avatar

Stargazers

 avatar  avatar Sean P. McAdam avatar Man Friday avatar SunX avatar Alireza Hokmabadi avatar  avatar Airat Aiupov avatar Taylan Tatlı avatar  avatar  avatar  avatar  avatar Jing Kang avatar  avatar  avatar Jovan avatar  avatar Giovanni Pollo avatar  avatar Xylit avatar Kalil avatar  avatar  avatar  avatar Hafizuddin Aminuddin avatar  avatar Mj_16 avatar  avatar  avatar Yunze avatar Victor Butler avatar Cameron Garrett avatar Oliver avatar Éric avatar  avatar Brent Oates avatar Morice O. avatar Arenz avatar Pierre Smit avatar  avatar  avatar Alberto C. avatar Yuzerion avatar Maxio avatar  avatar cudatuda avatar Rony Rashed Kashem avatar  avatar Sevdalin Sabev avatar Henrik Våglin avatar zzyo avatar Jack avatar Vedat Kamer avatar Chris Forte avatar  avatar  avatar Paulo Gonçalves avatar Kristoffer Braa avatar Daniel Bodnar avatar  avatar  avatar miles avatar MSTCL avatar Meir Blumenfeld avatar  avatar Andre avatar Cendenta avatar Tanvir Raj avatar Dave avatar Rafik EL YAAGOUBI avatar Danil Nikolaev avatar Emanuel Prado avatar  avatar  avatar  avatar  avatar Junghyuk Kwon avatar  avatar Flávio Ipiranga avatar Alan avatar Vishal kadam avatar Alexey avatar Dong Nguyen avatar Paul Hibbitts avatar  avatar MastarCheeze avatar Philip Okugbe avatar Mathy Vandersmissen avatar Volodymyr Linevych avatar Satish Surath avatar Mike avatar Tianjiu avatar nickelsw avatar Justin avatar Martin avatar  avatar Cenk Kılıç avatar Sabino Pereira avatar Kevin James O'Dea avatar

Watchers

 avatar  avatar

note-mark's Issues

(BUG) api server verification fails due to caching

Is there an existing issue for this?

  • I have searched the existing issues

Is This A Security Issue?

  • This is not a security issue

Describe The Problem

During the initialization page, if the original backend was configured incorrectly (i.e. wrong subpath in reverse proxy), and the page is run the first time, it will return a 404 (expected).

However, due to the lack of no-cache, the GET request for backend:8000/api/info will automatically used the browser cache, even after fixing the site, resulting in a 404 despite the configuration now being correct.

Expected Behavior

If I mess up reverse proxy config that causes a 404 and then fixes it, I should still be able to validate the api server on login even without clearing/disabling cache.

Steps To Reproduce

  1. Create an incorrect reverse proxy for API (i.e. proxy_pass to backend:8000/ instead of backend:8000 in nginx). Now hitting domain/api/info should return 404 not found
  2. Attempt initial setup with the backend server.
  3. Fix reverse proxy the be the right config
  4. Initial setup still fails validating backend server.

Environment

Docker setups for both, with npm (node proxy manager) as the reverse proxy, connected through docker networks.

Extra Context

No response

(BUG) Cannot update user profile

Is there an existing issue for this?

  • I have searched the existing issues

Is This A Security Issue?

  • This is not a security issue

Describe The Problem

When updating user full-name a error is shown (error 500).

Expected Behavior

User details are updated

Steps To Reproduce

  1. My Profile
  2. Update Profile
  3. Enter new name
  4. Save

Environment

No response

Extra Context

No response

Disable user registration

I am the only user or I'll create another account as needed. I need to disable registration as this will sit on public facing network.

Set a env to disable please

(BUG) Tasks list spacing

Is there an existing issue for this?

  • I have searched the existing issues

Is This A Security Issue?

  • This is not a security issue

Describe The Problem

The spacing between itens list is too high

Expected Behavior

The spacing should be lower

Steps To Reproduce

  1. Create a new note
  2. Create a item list

Environment

Server
os: Manjaro
install method: Docker

Client
os: MacOS 13.0
browser: Chrome Version 116.0.5845.140 (Official Build) (arm64)

Extra Context

Spacing at the note-mark rendered tab

image


Markdown code to reproduce the list:

📋 Tasks

  • task 1
  • task 2
  • task 3
  • task 4

(BUG) Updates Not Causing Cache To Invalidate

On any cached queries when updated other clients will get a stale response, therefore the program will not work as expected.

Effects:

  • Note Updates (not content updates)
  • Book Updates

(feat) Add documentation for using CLI in docker/k8s with Distroless tools

Does it fit the projects scope?

  • This is relevant

Why?

When you chose distro-less docker images gcr.io/distroless/static-debian11, please document how to use the CLI tools. There is no common way to access the shell via exec -it <shell>

Solution?

Document that you will need to exec directly to the init commands such as:
kubectl exec -it --namespace= -- /note-mark

kubectl exec -it notemark-675c5fb966-tfk8c --namespace=notes -- /note-mark user -h

Alternatives?

No response

Extra Context

No response

(feat) Fetch "my notebooks" from home page (or all public, or bookmarked?)

Does it fit the projects scope?

  • This is relevant

Why?

The home page doesn't provide a whole lot of value to single-user setups because of the big empty "NOTEBOOKS" column on the left. I can see in the code you're only ever filling that with notes if the username URL param is provided:

https://github.com/enchant97/note-mark/blob/7855b71aace0ee27f587256ca9e91f9964e4a391/frontend/src/App.tsx#L49C1-L49C1

Solution?

Perhaps we can fill the notebooks column with some actual results while on the non-user-specific home page? There are a few options:

  • If logged in, simply use the logged in user's name as a fallback for the URL param to supply list of "my notes"
  • Show all public notes (this could get out of hand quickly)
  • Show bookmarked notes (as mentioned in the roadmap)

In fact, even all three of these could potentially get surfaced as different options, i.e. by throwing in a dropdown/tabs/radio group to select which you want to display

Alternatives?

Obviously the main alternative solution would be to just remove the list altogether to reduce confusion since it doesn't get used, but that seems like a bit of a waste!

Extra Context

No response

(BUG) Notebooks list doesn't complete loading process

Is there an existing issue for this?

  • I have searched the existing issues

Is This A Security Issue?

  • This is not a security issue

Describe The Problem

The notebooks column on the left never loads. It continues to show the loading expanding circle, animation. Books and notes work properly when creating them and accessing them on the main section of the screen

Expected Behavior

From the demo, and screenshots, I should see a tree view of the books and notes I am adding as I add them. They never actually load.

Steps To Reproduce

  1. Create a new book
  2. Look for the book on the left column under "NOTEBOOKS"

Environment

macOS 14.4
Firefox 124.0.1
Apple Mac Mini M2 Pro

Docker Compose File:
note-mark:
container_name: note-mark
image: ghcr.io/enchant97/note-mark-aio:0.12.0
restart: unless-stopped
volumes:
- /opt/note-mark/data:/data
environment:
JWT_SECRET: "*SECRET*"
CORS_ORIGINS: "http://localhost:8000"
ports:
- '8000:8000'

Extra Context

notemark issue
CleanShot 2024-03-27 at 12 52 25
Books and Notes

(feat) Make notes searchable like useres are searchable.

Does it fit the projects scope?

  • This is relevant

Why?

Is the user search the only search, maybe I missed it? It might also be useful to search for notes.

Solution?

Make all notes searchable.

Alternatives?

No response

Extra Context

No response

(BUG) Unexpected error when Creating a new notebook with a repeated slug

Is there an existing issue for this?

  • I have searched the existing issues

Is This A Security Issue?

  • This is not a security issue

Describe The Problem

When creating a notebook, if you already have a notebook with the same slang, the API gives a error 500

Expected Behavior

Should create a new notebook, using the same slug but incremented in 1 at the end.

original slug: personal
new slug? personal-1

not doing that makes people need to remember every slug that already been used.

Steps To Reproduce

  1. Create a notebook with slug: "my-notebook"
  2. Create a new notebook with the same slug

Environment

Server
os: Manjaro
install method: Docker

Client
os: MacOS 13.0
browser: Chrome Version 116.0.5845.140 (Official Build) (arm64)

Extra Context

No response

(BUG) Can't create notebook when one does not already exist

Is there an existing issue for this?

  • I have searched the existing issues

Is This A Security Issue?

  • This is not a security issue

Describe The Problem

I just installed it and the ui is missing almost all features. I don't have any buttons to create notes:
image

Expected Behavior

image

Steps To Reproduce

Build using the following docker compose:
`# file: docker-compose.yml

built-for: 0.10.0

version: "3"

volumes:
data:

services:
note-mark:
image: ghcr.io/enchant97/note-mark-aio:0.10
restart: unless-stopped
volumes:
- data:/data
environment:
# !!! REPLACE These !!!
JWT_SECRET: "***********"
CORS_ORIGINS: "https://example.com:8000"
ports:
- 80:8000`

Environment

Docker Engine Community V 24.0.6
Ubuntu 22.04.2 LTS

Extra Context

No response

(feat) PDF and other exports.

Does it fit the projects scope?

  • This is relevant

Why?

sometimes you need to share a note with other people, or easily print it. it is much more convenient to send a pdf file instead of a link, especially if instance is not publically available.

Solution?

implement PDF export, possibly other formats like html. it is implemented well in Joplin desktop editor (so you could see an example).

Alternatives?

none, at lease from project description/roadmap.

Extra Context

No response

(feat) Add setting to show notebooks as expanded by default

Does it fit the projects scope?

  • This is relevant

Why?

It's a bit annoying to have to click into a notebook before even being able to see the notes therein. I realize this is done for performance since you currently only ever fetch notes on a per-book basis, but you could populate more useful data with the same number of requests with a bit of tweaking to the API.

Solution?

I propose a two-part solution:

  1. Add a user-preference option (simple boolean stored with the user in the DB) whether they'd like all the notes fetched alongside books and displayed on the left. This would require checking the field on the logged-in user's data and optionally calling a "getAllNotes" kind of new endpoint on the API
  2. Add a flag on the book level of whether to always show its notes. Would be visible next to the public checkbox. The UI might not even make any new API calls for this - simply have the backend return nested data for all the books where this flag is set to true.

Alternatives?

No response

Extra Context

No response

(feat) Option to change sort order for notebooks and notes

Does it fit the projects scope?

  • This is relevant

Why?

It would be nice to be able to sort notebooks and notes in different ways, according to current needs. This feature would make it easier to browse/find what we're currently looking for. It seems that now everything is sorted by creation time desc.

Solution?

Add sorting options to both, notebooks and notes, lists/containers.

Optionally, this feature could also be extended with an option to set default sorting option for the whole app. Let's say that default sort is Z to A. User can change sorting in the current session, but after reloading webpage, sorting will be back to the default Z to A.

Example sorting options from Obsidian:

image

Alternatives?

No response

Extra Context

Very promising project. Lately, I've been looking for something similar to Obsidian but simplified and with Web UI so Note Mark fits perfectly.

Looking forward to further updates and upcoming features. Great job and good luck!

(BUG) Dropdown menu goes behind the editor menu

Is there an existing issue for this?

  • I have searched the existing issues

Is This A Security Issue?

  • This is not a security issue

Describe The Problem

when you are in the editor mode and klick on the ... menu, the menu goes behind the button bar

note-mark-menu

Expected Behavior

menu should be in front

Steps To Reproduce

No response

Environment

MacOS
Safari /Edge Browser

Extra Context

No response

(BUG) Using the aio version, it still requesting the API server

Is there an existing issue for this?

  • I have searched the existing issues

Is This A Security Issue?

  • This is not a security issue

Describe The Problem

Using the aio version, it still requesting the API server
2023-12-27 211137

Expected Behavior

Not ask for a API address

Steps To Reproduce

Update docker container to aio version and try to login

Environment

No response

Extra Context

No response

(feat) Show the content of a folder in main view

Does it fit the projects scope?

  • This is relevant

Why?

Just like the starting-page-main-view recent notes, show the content of a folders in main view when selecting one folder.

Solution?

Show the content of a folders when selecting one.

Alternatives?

No response

Extra Context

No response

Docker export volume

What is the path to export the data? I want to be sure it's backed up nightly.

Create account never gets enabled

Is there an existing issue for this?

  • I have searched the existing issues

Is This A Security Issue?

  • This is not a security issue

Describe The Problem

After deployed the application using docker-compose, I connect to 127.0.0.1:8000 and fill in the form for creating an account, but the button CREATE USER never gets enabled and I can't create the account.

Expected Behavior

The account is created and I can login using the credentials

Steps To Reproduce

  1. Create file docker-compose.yml
version: "3"

volumes:
  data:

services:
  backend:
    image: ghcr.io/enchant97/note-mark-backend:0.6.0

    restart: unless-stopped
    volumes:
      - data:/data
    environment:
      # !!! REPLACE These !!!
      JWT_SECRET: "bXktc2VjcmV0"
      CORS_ORIGINS: "*"
    ports:
      - 8001:8000

  frontend:
    image: ghcr.io/enchant97/note-mark-frontend:0.6.0

    restart: unless-stopped
    ports:
      - 8000:8000
  1. Run sudo docker-compose up -d
  2. From the broswer connect to http://127.0.0.1:8000
  3. Click Need an account
  4. Fill the fields using a secure password like P@ssword123 -> the button Create user is greyed out

Environment

Fedora 38 KDE

Extra Context

No response

Button to quickly copy entire contents to clipboard

Does it fit the projects scope?

  • This is relevant

Why?

I would like to be able to copy the entire article to clipboard easily and rapidly. Ctrl-A doesn't work as it includes other content.

Solution?

Please add a new button to the toolbar that indicates copy contents.

Alternatives?

I would be willing to pay a small bounty to get this feature as it helps my workflow significantly.

Extra Context

Thank you

(feat) Check and Uncheck tasks itens in the Render screen

Does it fit the projects scope?

  • This is relevant

Why?

Doing a task list normally you setup what you need to do, them you go to your note and just check your progress. Needing to enter in the edit mode, make me feels like I'm just using a notepad that has a preview screen(that maybe I'll never use).

Making the render more useful to the user.

Solution?

like github, you doesn`t need to enter the edit screen, at the render you can directly click in the checkbox to make that task completed.

Alternatives?

No response

Extra Context

  • item 1
  • item 2
  • item 3
  • item 4
  • item 5

(BUG) proxy forward auth/IDP and CORS

Is there an existing issue for this?

  • I have searched the existing issues

Is This A Security Issue?

  • This is not a security issue

Describe The Problem

Hi, very nice, slim app 👍
I am using a nginx reverse proxy and everthing works fine. I also enabled CORS (tried both * and my TDLs) and using no cache...

image

When I enable my Authentik proxy forward auth/IDP the app tries to make an request to /api which is forwarede to my IDP auth.TLD.com:

noteMarkCors

Access to fetch at 'https://auth.TLD.com/application/o/authorize/?client_id=EuOyaHfRyXXXXe.com%2Foutpost.goauthentik.io%2Fcallback%3FX-authentik-auth-callback%3DtrXXXXn8Q' (redirected from 'https://note.TLD.com/api/users/me') from origin 'https://note.TLD.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

This seems to fail because of missing CORS headers. Any Ideas on this?

Expected Behavior

No Error with a proxy forward auth setup.

Steps To Reproduce

No response

Environment

No response

Extra Context

No response

(feat) Disable authentication

Does it fit the projects scope?

  • This is relevant

Why?

If one wants to use his own IDP (proxy-forward-auth) you might want to disable auth in the app.
And/or implement OIDC/SAML to use an OAuth2 provider.

Solution?

Disable auth in the app.

Alternatives?

No response

Extra Context

No response

(feat) Creation of subnotebooks

Does it fit the projects scope?

  • This is relevant

Why?

When I'm organizing my notes, I normally make folders and subfolders for context propose.

An example of structure:

  • Work-notebook
    • Project1-notebook
      • tasks-note
      • faq-note
      • events-note
      • cocuments-note
    • Project2-notebook
      • tasks-note
      • documents-note
    • meet-links-note
    • time-sheet-note
    • Meetings-notebook
      • 2023-09-09-daily-note
  • Personal-notebook
    • Groceries-list-note
    • Travel-notebook
      • europe-2024-plans-note

without the habilite to make this subfolders, I would be hard to separate everything, or I would have many long named note or many long named notebooks.

Solution?

Creating some path structure for the notebook, could be done using the / character inside the name of the notebook, just needing to render the tree in the frontend

Alternatives?

Using the current solution, but with the option to re-order the notebook or to order alphabetically.

With the re-order option, I would be able to create the notebooks as needed, and order them manually to be "inside" the "father" path.
image

With the alphabetically ordered, I could make my notebooks start with a number so I can order them as I wish.
image

Extra Context

No response

Web page not loading with Mull Android web browser

Is there an existing issue for this?

  • I have searched the existing issues

Is This A Security Issue?

  • This is not a security issue

Describe The Problem

Low priority.
When opening Notes-Mark on my docker install only on the app Mull on Android loading the page does not work. All I get is a white loading page with a spinning wheel.
Using a browser that isn't hardened works perfectly and as expected.

Expected Behavior

Web page opens normally.

Steps To Reproduce

No response

Environment

No response

Extra Context

No response

(BUG) PDF attachments become difficult to access

Is there an existing issue for this?

  • I have searched the existing issues

Is This A Security Issue?

  • This is not a security issue

Describe The Problem

I'm able to attach a PDF file and add a link to it in my note, but it's difficult to access the file.

Clicking the link in my note (/api/notes/xxx/assets/xxx) produces a 200 response with Content-Type: text/html and renders a blank page.

Refreshing the page in Firefox and Chrome will continue to produce the same text/html response. A hard-refresh will bypass the browser cache and produce the appropriate Content-Type: application/pdf response. Accessing the attachment via curl also returns the correct Content-Type header.

Once the PDF is finally rendered in-browser (after hard-refresh), the browser's back button becomes non-functional and only adjusts the URL in the browser's URL bar but does not navigate away from the PDF.

This seems to be an issue with how the client-side code in the front-end web app renders responses returned by the backend server.

Expected Behavior

Accessing file attachments while navigating from the web app should produce proper Content-Type header responses.

Steps To Reproduce

  1. Create a note.
  2. Upload a PDF attachment for that note.
  3. Include a link to the attachment with relative path [file][/api/...] or absolute path [file][https://domain.com/api/...]
  4. Click the link.

Environment

  • Docker AIO through nginx reverse proxy
  • Docker AIO direct access

Extra Context

Cool project, thanks for building this.

I'm trying to deploy this for friends/family but the workarounds are not practical for non-technical users.

Disable security or control the cookie expiration

Does it fit the projects scope?

  • This is relevant

Why?

I am using a reverse proxy for auth, so I prefer not having to re-login to the KB every day.

Solution?

Can you provide a docker env var to disable authentication and just set a default username? Or can you provide a mechanism to set the cookie expiration to a far away date.

Alternatives?

No response

Extra Context

No response

(feat) Side-by-side edit-preview

Does it fit the projects scope?

  • This is relevant

Why?

to make easy editing notes and seeing the result os your changes.

Solution?

at the edit tab it would have a option to split the edition to see the changes that you are making in real time preview.

Alternatives?

maybe an auto-save on lose focus or change tabs, so I can see the rendered without losing the edited content

Extra Context

No response

(feat) Clickable breadcrumbs

Does it fit the projects scope?

  • This is relevant

Why?

While I will say this isn't a big problem because the app isn't deeply nested, it also feels like a pretty easy fix.

Short of it is the breadcrumbs are not clickable links like I would intuitively think.

Solution?

Just change the <span> tag in each of the breadcrumbs into an <a> tag

Alternatives?

No response

Extra Context

No response

(BUG) Changing tab looses all edits

Is there an existing issue for this?

  • I have searched the existing issues

Is This A Security Issue?

  • This is not a security issue

Describe The Problem

When you are editing a note, if you want to preview (render) what you are editing, you will loose all your changes if you don't click on save.

Expected Behavior

If this is the expected behaviour, it should at least alert the user that he will loose all the changes made so far and ask if he wants to go anyway, save and go, stay editing.

Steps To Reproduce

  1. Create a note
  2. Edit a note without saving
  3. Go to Rendered tab

Environment

Server
os: Manjaro
install method: Docker

Client
os: MacOS 13.0
browser: Chrome Version 116.0.5845.140 (Official Build) (arm64)

Extra Context

No response

(feat) Add a copy button to code blocks

Does it fit the projects scope?

  • This is relevant

Why?

Adding a "copy" button to a notes editor offers practical benefits, such as facilitating easy sharing and quick duplication. This feature preserves formatting, reduces user effort, ensures consistency in UI/UX, and enhances mobile-friendly functionality. The button also integrates with the clipboard, streamlining the process of copying and pasting content across applications. Overall, it contributes to a more efficient and user-friendly experience.

Solution?

image image

Add a copy button as shown in Notion's screenshot on the left. Using the code block here.

Alternatives?

No response

Extra Context

No response

Roadmap

  • this issue documents the current roadmap of things to do and what release to expect them in
  • this roadmap however is not set in stone and may change overtime
  • this is not a place to request features, use the GitHub discussions

Buy Me A Coffee

0.14.0

TBD

0.X.X

  • Make assets easier to access
  • Templating language in note (link generation, etc)
  • External OpenID/Oauth2 authentication
  • Better error messages
  • bookmark notes (show on home)
  • revision history
  • offline access (may be read-only at first)

Not Priority

  • Tags (including nested tags)
  • unlimited nesting of notebooks/notes (notebooks inside notebooks)

Not Implementing

  • encrypted end-to-end notes
  • any-other note type apart from markdown/plain-text (assets can still be uploaded)
  • WYSIWYG editor

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.