Skip to content
Projects

kovetskiy/mark has 1,613 GitHub stars and 244 forks. GitHot measured 0 stars in 24 hours and +8 in 7 days. Last checked 2026-11-08 23:28 UTC. Last push 2026-11-05.

How these counts are measured

Sync your markdown files with Confluence pages.

Measured star growth

in 24h
0
in 7 days
+8
in 15 days
Collecting history
in 1 month
Collecting history

Net star changes over overlapping periods, not daily totals. Missing measurements are left blank. Stars measure attention, not software quality.

README.md

Original

Mark

All Contributors

Mark — a tool for syncing your markdown documentation with Atlassian Confluence pages.

This is very useful if you store documentation to your software in a Git repository and don't want to do an extra job of updating Confluence page using a tinymce wysiwyg enterprise core editor which always breaks everything.

Mark does the same but in a different way. Mark reads your markdown file, creates a Confluence page if it's not found by its name, uploads attachments, translates Markdown into HTML and updates the contents of the page via REST API. It's like you don't even need to create sections/pages in your Confluence anymore, just use them in your Markdown documentation.

A document names its page in a few header comments, and the rest is the page:

<!-- Space: DOCS -->
<!-- Parent: Guides -->
<!-- Title: Release process -->

How a release is cut.
mark publish -b https://example.atlassian.net/wiki -u user -p token -f docs/release.md

Documentation

The reference is split by topic under docs/:

  • Page metadata: YAML front matter and header comments, layout and appearance, restrictions, page titles, labels and content properties.
  • Where pages go: parents and folders, parents from the directory tree, tracking pages across renames, removing pages whose files are gone, and listing, moving, copying, renaming, removing and watching pages by hand with mark page.
  • Formatting: how Markdown becomes Confluence content, including code blocks, alerts, tables, task lists, Mermaid, D2 and PlantUML diagrams, math, footnotes and emoji.
  • Attachments and images.
  • Links: links to other pages, link checking, and heading anchors.
  • Includes, macros and templates, with the built-in templates and examples.
  • Publishing: publishing to a page by its URL, page headers, run reports, what happens when Confluence is unavailable, continuous integration, preserving inline comments, and leaving hand-edited pages alone.
  • Exporting a page, or a tree of them, from Confluence back to Markdown.

Installation

Homebrew

brew tap kovetskiy/mark
brew install mark

Go Install

go install github.com/kovetskiy/mark/v17/cmd/mark@latest

This installs the newest v17 release, so it needs a v17 tag. Until v17.0.0 is tagged, @latest builds the newest commit on the default branch instead of a release; install from the Releases page or Homebrew to get a release.

Releases

Download a release from the Releases page

Docker

docker run --rm -i kovetskiy/mark:latest mark publish <params>

Compile and install using docker-compose

Mostly useful when you intend to enhance mark.

# Create the binary
$ docker-compose run markbuilder
# "install" the binary
$ cp mark /usr/local/bin

Usage

mark does one thing per command. mark publish compiles markdown files and publishes them to Confluence:

mark publish -u user -p token -b https://example.atlassian.net/wiki -f "docs/**/*.md"

and the experimental mark export writes a Confluence page out as markdown that publishes back to it; see Exporting a page.

mark doctor checks a setup without changing anything. It logs in with the global options, says which platform answered, and checks that each space it is given exists and lets the account create pages and upload attachments. A login that Confluence answers as the anonymous user fails, since a proxy that drops the credentials looks like a working login otherwise, and so does an empty space key, as an unset $SPACE gives. A space without a home page is only a warning: a page with no Parent header is then published at the top of the space. When a check fails, it says what to change:

$ mark doctor -b https://example.atlassian.net/wiki -u [email protected] -p "$TOKEN" DOCS
[ok] login: logged in as Jane Doe ([email protected], 5b10ac8d82e05b22cc7d4ef5)
[ok] platform: Confluence Cloud
[ok] space DOCS: "Documentation" is readable
[ok] space DOCS: home page "Documentation Home" (98306)
[ok] space DOCS: can create pages, upload attachments, create blog posts (Type: blogpost)
[warn] space DOCS: cannot delete pages (--on-orphan delete), archive pages (--on-orphan archive), restrict pages (--edit-lock, Restriction headers)
       a space administrator grants these under the space's permissions

It exits with an error when any check fails, and without one when there are only warnings, so it can also run as the first step of a pipeline. With no space given it checks --space, from the command line, MARK_SPACE or the configuration file.

The global options -- the configuration file, how to reach and authenticate against Confluence, and logging -- belong to every command, and can be given before or after its name: mark -c ci.toml publish -f doc.md and mark publish -c ci.toml -f doc.md are the same run. The options of a command go after its name.

NAME:
   mark - A tool for updating Atlassian Confluence pages from markdown.

USAGE:
   mark [global options] [command [command options]]

VERSION:
   vX.Y.Z

DESCRIPTION:
   Mark is a tool to update Atlassian Confluence pages from markdown. Documentation is available here: https://github.com/kovetskiy/mark

COMMANDS:
   publish  publish markdown files to Confluence
   export   export a Confluence page, or a tree of them, to markdown (experimental)
   page     list, move, copy, rename, archive, delete or watch Confluence pages (experimental)
   doctor   check that mark can reach Confluence, log in, and publish to a space
   help, h  Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --config string, -c string    use the specified configuration file. (default: "${HOME}/.config/mark.toml") [$MARK_CONFIG]
   --username string, -u string  use specified username to authenticate with Confluence. [$MARK_USERNAME]
   --password string, -p string  use specified token to authenticate with Confluence. Specify - as password to read password from stdin, or your Personal access token. Username is not mandatory if personal access token is provided. For more info please see: https://developer.atlassian.com/server/confluence/confluence-server-rest-api/#authentication. [$MARK_PASSWORD]
   --password-command string     run the specified command and use the first line of its stdout as the token to authenticate with Confluence. Runs without a shell. Mutually exclusive with password. [$MARK_PASSWORD_COMMAND]
   --base-url string, -b string  base URL for Confluence. Alternative to the base-url config file key. [$MARK_BASE_URL]
   --insecure-skip-tls-verify    skip TLS certificate verification (useful for self-signed certificates) [$MARK_INSECURE_SKIP_TLS_VERIFY]
   --log-level string            set the log level. Possible values: TRACE, DEBUG, INFO, WARNING, ERROR, FATAL. (default: "info") [$MARK_LOG_LEVEL]
   --color string                display logs in color. Possible values: auto, never. (default: "auto") [$MARK_COLOR]
   --help, -h                    show help
   --version, -v                 print the version

mark publish

NAME:
   mark publish - publish markdown files to Confluence

USAGE:
   mark publish [options]

DESCRIPTION:
   Compile each markdown file --files names into Confluence storage format and create or update the page its metadata names.

OPTIONS:
   --files string, -f string                      use specified markdown file(s) for converting to html. Supports file globbing patterns (needs to be quoted). [$MARK_FILES]
   --continue-on-error                            don't exit if an error occurs while processing a file, continue processing remaining files. [$MARK_CONTINUE_ON_ERROR]
   --compile-only                                 show resulting HTML and don't update Confluence page content. [$MARK_COMPILE_ONLY]
   --dry-run, -n                                  resolve page and ancestry, show resulting HTML and exit. With --changes-only, say which pages would change and show the HTML of only those, and none with --output-format json or github. [$MARK_DRY_RUN]
   --edit-lock, -k                                lock page editing to current user only to prevent accidental manual edits over Confluence Web UI. [$MARK_EDIT_LOCK]
   --drop-h1                                      don't include the first H1 heading in Confluence output. [$MARK_DROP_H1]
   --strip-linebreaks, -L                         remove linebreaks inside of tags, to accommodate non-standard Confluence behavior [$MARK_STRIP_LINEBREAKS]
   --title-from-h1                                extract page title from a leading H1 heading. If no H1 heading on a page exists, then title must be set in the page metadata. Mutually exclusive with --title-from-filename. [$MARK_TITLE_FROM_H1]
   --title-from-filename                          use the filename (without extension) as the Confluence page title if no explicit page title is set in the metadata. Mutually exclusive with --title-from-h1. [$MARK_TITLE_FROM_FILENAME]
   --parents-from-path                            place each page under a page named after every directory between the file pattern's root and the file itself. An index.md or README.md is the page for its own directory rather than a page inside it. A document that names its own Parent is left alone. [$MARK_PARENTS_FROM_PATH]
   --parents-from-path-root string                the directory --parents-from-path measures from. Taken from the --files pattern when not given, which is everything before its first wildcard. [$MARK_PARENTS_FROM_PATH_ROOT]
   --title-append-generated-hash                  appends a short hash generated from the path of the page (space, parents, and title) to the title [$MARK_TITLE_APPEND_GENERATED_HASH]
   --minor-edit                                   don't send notifications while updating Confluence page. [$MARK_MINOR_EDIT]
   --watch                                        let the publishing account watch the pages mark creates or edits, as Confluence makes it (default: true, which leaves Confluence's own behaviour alone); --watch=false stops it watching them, though pages it watched already stay watched. [$MARK_WATCH]
   --version-message string                       add a message to the page version, to explain the edit (default: "") [$MARK_VERSION_MESSAGE]
   --target-url string, -l string                 edit the Confluence page at this URL, as a browser shows it: .../pages/viewpage.action?pageId=ID or .../spaces/KEY/pages/ID/Title. The instance is taken from it too, context path included, unless --base-url names it. Without it, each file must name its page with Space and Title metadata headers. [$MARK_TARGET_URL]
   --ci                                           run on CI mode. It won't fail if files are not found. [$MARK_CI]
   --space string, -s string                      use specified space key. If the space key is not specified, it must be set in the page metadata. [$MARK_SPACE]
   --parents string                               A list containing the parents of the document separated by parents-delimiter (default: '/'). These will be prepended to the ones defined in the document itself. [$MARK_PARENTS]
   --parents-delimiter string                     The delimiter used for the parents list (default: "/") [$MARK_PARENTS_DELIMITER]
   --content-appearance string                    default content appearance for pages without a Content-Appearance header. Possible values: full-width (Wide), default (Narrow), max (Max). [$MARK_CONTENT_APPEARANCE]
   --mermaid-scale float                          defines the scaling factor for mermaid renderings: the pixels of a png, and the size the page displays an svg at. (default: 1) [$MARK_MERMAID_SCALE]
   --mermaid-engine string                        what mermaid diagrams are drawn by: chrome (the default, a headless browser running mermaid.js) or merman (experimental, a native reimplementation that needs no browser and must be installed separately). (default: "chrome") [$MARK_MERMAID_ENGINE]
   --mermaid-output string                        image a mermaid diagram is published as: png (rasterised, and scaled by --mermaid-scale) or svg (vector and sharp at any zoom, where the instance displays an SVG attachment). (default: "png") [$MARK_MERMAID_OUTPUT]
   --mermaid-bundle                               keep the diagram's own source inside the SVG published for it, in its <desc> element, so the drawing can be edited again from the attachment. Needs --mermaid-output=svg. [$MARK_MERMAID_BUNDLE]
   --math-format string                           image a formula is published as with --features=math: png (rasterised through the same headless Chrome mermaid uses) or svg (vector and sharp at any zoom, where the instance displays an SVG attachment). (default: "png") [$MARK_MATH_FORMAT]
   --math-scale float                             defines the scaling factor for PNG formula renderings; ignored when math-format is svg. (default: 2) [$MARK_MATH_SCALE]
   --include-path string                          Path for shared includes, used as a fallback if the include doesn't exist in the current directory. [$MARK_INCLUDE_PATH]
   --changes-only                                 Avoids re-uploading pages that haven't changed since the last run. [$MARK_CHANGES_ONLY]
   --output-format string                         how to report what the run did: "url" prints the address of each published page (the default), "json" prints one object describing the whole run, "github" prints GitHub Actions workflow commands so that failures appear against the file that caused them. (default: "url") [$MARK_OUTPUT_FORMAT]
   --on-orphan string                             what to do about a page whose source file is gone: "report" says so and does nothing (the default), "archive" archives the page (Confluence Cloud only), "delete" moves it to the trash. Requires --track-pages. (default: "report") [$MARK_ON_ORPHAN]
   --orphan-under string                          limit --on-orphan, and the reporting it does, to pages below this page or folder, given by title or id. Without it, every tracked page the --files pattern would have published is in scope. [$MARK_ORPHAN_UNDER]
   --check-links string [ --check-links string ]  fail on links that do not resolve. Repeat or comma-separate any of: "internal" (relative links to other files in the repository), "confluence" (ac: links naming a page by title), "external" (requests each URL to see whether it answers), or "all". [$MARK_CHECK_LINKS]
   --global-properties string                     path to a YAML or JSON file of Confluence content properties to set on every page. A Property header or properties front matter in a document wins over the file for that page. [$MARK_GLOBAL_PROPERTIES]
   --append-labels                                add the labels a document asks for without removing any others, so that labels applied in Confluence survive a publish. Without it, a page ends up with exactly the labels its Label headers name. [$MARK_APPEND_LABELS]
   --check-links-warn-only                        report links that do not resolve without failing the run. Only meaningful together with --check-links. [$MARK_CHECK_LINKS_WARN_ONLY]
   --no-overwrite                                 Leave alone any page that has been edited in Confluence since mark last published it, instead of overwriting the edit. Requires --track-pages, which is where the last published version is remembered. [$MARK_NO_OVERWRITE]
   --track-pages                                  Remember which page each file publishes to, so renaming a file or changing its title updates the existing page instead of creating a second one. Stores the mapping in Confluence (a space property on Cloud, a homepage content property on Server/Data Center, or the page --manifest-page names); nothing is written to the repository. [$MARK_TRACK_PAGES]
   --manifest-page string                         keep the --track-pages mapping as content properties of this page, given by title or id, instead of as space properties. Needs only the right to edit that page where a space property needs space administration, and works with a scoped API token. Requires --track-pages. [$MARK_MANIFEST_PAGE]
   --manifest-prefix string                       name the --track-pages mapping's properties under this prefix, so that two projects publishing into one space keep manifests of their own instead of sharing, and reporting each other's files as gone. Letters, digits, '_', '-' and dots. Requires --track-pages. (default: "mark.manifest") [$MARK_MANIFEST_PREFIX]
   --preserve-comments                            Fetch and preserve inline comments on existing Confluence pages. [$MARK_PRESERVE_COMMENTS]
   --d2-output string                             image a d2 diagram is published as: png (rasterised) or svg (vector and sharp at any zoom, with whatever the diagram references inlined into it, where the instance displays an SVG attachment). (default: "png") [$MARK_D2_OUTPUT]
   --d2-bundle-remote                             let a d2 diagram published as svg have mark fetch the URLs it names, and publish what comes back inside the drawing. Off by default, which refuses a diagram that names a URL: the request is made by the document rather than by you, to any address it likes. [$MARK_D2_BUNDLE_REMOTE]
   --d2-scale float                               defines the scaling factor for d2 renderings: the pixels of a png, and the size the page displays an svg at. (default: 1) [$MARK_D2_SCALE]
   --features string [ --features string ]        Enables optional features, replacing the defaults (mermaid, mention) rather than adding to them; none switches every one off. Current features: d2, date, emoji, frontmatter, inline-link-card, math, mention, mermaid, mkdocsadmonitions, plantuml (default: "mermaid", "mention") [$MARK_FEATURES]
   --attach-referenced                            upload a local file that a link points at, and link to the attachment. Without it the link is published as the path the document wrote, which means nothing once the page is on Confluence. Images are attached either way. [$MARK_ATTACH_REFERENCED]
   --image-align string                           set image alignment (left, center, right). Can be overridden per-file via the Image-Align header. [$MARK_IMAGE_ALIGN]
   --page-header string                           path to a template placed at the top of every page: Markdown if it has a Markdown extension such as .md, storage format otherwise. It is given .Path, .EscapedPath, .Title and .Space. [$MARK_PAGE_HEADER]
   --help, -h                                     show help

GLOBAL OPTIONS:
   --config string, -c string    use the specified configuration file. (default: "${HOME}/.config/mark.toml") [$MARK_CONFIG]
   --username string, -u string  use specified username to authenticate with Confluence. [$MARK_USERNAME]
   --password string, -p string  use specified token to authenticate with Confluence. Specify - as password to read password from stdin, or your Personal access token. Username is not mandatory if personal access token is provided. For more info please see: https://developer.atlassian.com/server/confluence/confluence-server-rest-api/#authentication. [$MARK_PASSWORD]
   --password-command string     run the specified command and use the first line of its stdout as the token to authenticate with Confluence. Runs without a shell. Mutually exclusive with password. [$MARK_PASSWORD_COMMAND]
   --base-url string, -b string  base URL for Confluence. Alternative to the base-url config file key. [$MARK_BASE_URL]
   --insecure-skip-tls-verify    skip TLS certificate verification (useful for self-signed certificates) [$MARK_INSECURE_SKIP_TLS_VERIFY]
   --log-level string            set the log level. Possible values: TRACE, DEBUG, INFO, WARNING, ERROR, FATAL. (default: "info") [$MARK_LOG_LEVEL]
   --color string                display logs in color. Possible values: auto, never. (default: "auto") [$MARK_COLOR]

mark export

NAME:
   mark export - export a Confluence page, or a tree of them, to markdown (experimental)

USAGE:
   mark export [options]

DESCRIPTION:
   Experimental: the Markdown it writes may change between releases. Write the page --page-id, --url or --space and --title names as markdown, with the metadata headers that publish it back to the same page, and download the attachments it shows or links to.

OPTIONS:
   --page-id string            export the page or blog post with this id. [$MARK_PAGE_ID]
   --url string, -l string     export the page at this address, as a browser shows it: /spaces/KEY/pages/ID/... on Cloud, /display/KEY/Title or /pages/viewpage.action?pageId=ID on Server and Data Center, or a short /x/... link on either. Also gives the base URL when --base-url is not set. [$MARK_URL]
   --space string, -s string   the space key --title looks the page up in. [$MARK_SPACE]
   --title string, -t string   export the page or blog post with this title in --space. [$MARK_TITLE]
   --output string, -o string  write the Markdown to this file rather than to standard output ("-"). [$MARK_OUTPUT]
   --attachments-dir string    write the attachments the page shows or links to into this directory. Defaults to the directory of --output, or the working directory; a directory of their own changes their names when the document is published back, since mark names an attachment after its path. [$MARK_ATTACHMENTS_DIR]
   --overwrite                 replace the Markdown file and attachments if they are already there. Without it, the export fails before writing anything. [$MARK_OVERWRITE]
   --format string             what to write: "mark", a document mark publishes back to the page, or "okf", an Open Knowledge Format concept, and with --recursive a bundle of them, for agents and knowledge catalogs to read. (default: "mark") [$MARK_FORMAT]
   --metadata string           how a "mark" document spells the metadata that names its page: "comments", HTML comment headers, or "frontmatter", YAML front matter, which mark publishes only with the frontmatter feature (--features=mermaid,mention,frontmatter). --format okf ignores it. (default: "comments") [$MARK_METADATA]
   --no-attachments            write the Markdown only, and download no attachments. The document still refers to them where they would have been written. [$MARK_NO_ATTACHMENTS]
   --recursive, -r             export the pages beneath it too, into the directory --output names: the page to index.md there, and each page beneath it to index.md in a directory of its own named after its title.
   --depth int, -d int         with --recursive, export this many levels, counting the page itself; 0 is every level. (default: 0)
   --relative-links            with --recursive, write a link between two exported pages, or a URL of one pasted into a page, as a relative link between their files, which a repository host can follow, rather than as ac:Title or the URL. Published back, such a link becomes a link to the page's address rather than Confluence's own page link.
   --help, -h                  show help

GLOBAL OPTIONS:
   --config string, -c string    use the specified configuration file. (default: "${HOME}/.config/mark.toml") [$MARK_CONFIG]
   --username string, -u string  use specified username to authenticate with Confluence. [$MARK_USERNAME]
   --password string, -p string  use specified token to authenticate with Confluence. Specify - as password to read password from stdin, or your Personal access token. Username is not mandatory if personal access token is provided. For more info please see: https://developer.atlassian.com/server/confluence/confluence-server-rest-api/#authentication. [$MARK_PASSWORD]
   --password-command string     run the specified command and use the first line of its stdout as the token to authenticate with Confluence. Runs without a shell. Mutually exclusive with password. [$MARK_PASSWORD_COMMAND]
   --base-url string, -b string  base URL for Confluence. Alternative to the base-url config file key. [$MARK_BASE_URL]
   --insecure-skip-tls-verify    skip TLS certificate verification (useful for self-signed certificates) [$MARK_INSECURE_SKIP_TLS_VERIFY]
   --log-level string            set the log level. Possible values: TRACE, DEBUG, INFO, WARNING, ERROR, FATAL. (default: "info") [$MARK_LOG_LEVEL]
   --color string                display logs in color. Possible values: auto, never. (default: "auto") [$MARK_COLOR]

Upgrading from mark without a command

Before it had commands, mark took the publish options directly. Since v17 it no longer does: mark -f doc.md fails, naming the command the option belongs to, and mark on its own prints the help and fails. Put publish after mark, before the publish options:

mark -c ci.toml -f doc.md            # before v17
mark -c ci.toml publish -f doc.md    # v17

The global options can stay where they were, and the environment variables and the configuration file are read as before.

You can store user credentials in the configuration file, which should be located in a system specific directory (or specified via -c --config <path>) with the following format (TOML):

username = "your-email"
password = "password-or-api-key-for-confluence-cloud"
# Or name a command that prints the token, instead of storing it here:
# password-command = "pass show confluence/api-token"
# If you are using Confluence Cloud add the /wiki suffix to base-url
base-url = "http://confluence.local"
title-from-h1 = true
drop-h1 = true
image-align = "center"

A key is the long name of a flag, without the dashes. One file serves every command, so it may hold the keys of publish, export, doctor and page together, and each command reads the ones it has. A key that no command has is an error, naming each such key and the one it is probably a typo of:

unknown key "tittle-from-h1" in configuration file "/home/jane/.config/mark.toml": did you mean "title-from-h1"?

Before v17 such a key was ignored, so a misspelt setting did nothing and said nothing. A file that still holds one has to lose it, or correct it, to run.

NOTE: password-command keeps the token out of both the configuration file and the environment. A password manager or keychain helper supplies it per run.

The command runs without a shell, so the string is split on whitespace and nothing is expanded: there is no quoting, and a program path or argument containing a space cannot be written here. Wrap such a helper in a small script and name the script instead. The command also gets no standard input, so a helper that prompts on stdin cannot be used -- one that opens the terminal itself, as pinentry does, is fine.

Only the first line of what the command prints becomes the token, so a helper that prints a whole entry with the password on top -- pass show does -- needs no wrapper to trim it.

The command has to fetch the secret rather than contain it. It is handed to the operating system as written, so anyone who can list processes can read it for as long as it runs -- which is the exposure password-command exists to avoid, and writing a token into the command itself puts it straight back.

password and password-command are mutually exclusive, and setting both -- in any combination of flag, environment variable and configuration file -- is an error rather than a choice mark makes for you. Moving to a command therefore means taking the password out of the configuration file, not leaving it there beside the new setting.

A compile resolves the command like any other run, since a relative link is followed by looking that page up. A helper that cannot produce a token there is a warning and not an error, because --compile-only has to keep validating documents on a machine -- a CI image, typically -- that has no password manager on it.

Scoped API tokens

An Atlassian scoped API token only works through the api.atlassian.com gateway, so that is what the base URL has to name:

base-url = "https://api.atlassian.com/ex/confluence/<cloud-id>"

The gateway checks the token's scopes against the endpoint being called, and the older v1 endpoints check content scopes a scoped token is not usually minted with. Through the gateway mark therefore reads, creates and updates pages with the v2 API, which needs:

scope what it is for
read:space:confluence resolving a space key and finding its home page
read:page:confluence, write:page:confluence finding, reading, creating and updating pages
read:blogpost:confluence, write:blogpost:confluence the same for blog posts (Type: blogpost)
read:attachment:confluence listing what is attached to a page, and mark export downloading it
read:label:confluence reading the labels a page carries
read:content.property:confluence, write:content.property:confluence the content appearance and emoji title of a page
read:page:confluence, write:page:confluence --track-pages with --manifest-page; without it the mapping is a space property, whose creation a scoped token is refused
read:folder:confluence, write:folder:confluence, read:hierarchical-content:confluence Folder headers: reading and creating folders, and finding one among its parent's direct children

Uploading attachments, applying Label headers, --preserve-comments, --on-orphan, --watch=false, page restrictions, mentions, moving a page among its siblings and finding a folder left at the space root have no v2 endpoint and stay on v1. To use those with a scoped token, grant the classic scopes (read:confluence-content.all, write:confluence-content, read:confluence-user) alongside the granular ones.

NOTE: Labels aren't supported when using minor-edit!

NOTE: Attachments are always uploaded as minor edits, whether or not --minor-edit is set. Watchers are notified about the page update that carries them, which --minor-edit controls, rather than once more for every file.

NOTE: Confluence makes whoever creates or edits a page watch it, so the account Mark publishes with is notified of every later change to every page it touched. --watch=false stops it watching the pages it creates, updates, moves, labels or attaches files to, parents included, once the run's last write is done. A page the account already watched before Mark first wrote to it in the run stays watched, and so does a page an earlier run left watched: Confluence does not say why an account watches a page. Where the account can be changed, turning off its own preference to watch what it creates or edits does the same with no requests, and mark page unwatch --recursive stops it watching pages it already does.

NOTE: See Preserving Inline Comments for a detailed description of the --preserve-comments flag.

NOTE: The system specific locations are described in here: https://pkg.go.dev/os#UserConfigDir. Currently, these are: On Unix systems, it returns $XDG_CONFIG_HOME as specified by https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html if non-empty, else $HOME/.config. On Darwin, it returns $HOME/Library/Application Support. On Windows, it returns %AppData%. On Plan 9, it returns $home/lib. Where none of these is set, as in a minimal container or a systemd unit, there is no default file, and one is read only if --config or MARK_CONFIG names it.

Issues, Bugs & Contributions

I've started the project to solve my own problem and open sourced the solution so anyone who has a problem like me can solve it too. I have no profits/sponsors from these projects which means I don't really prioritize working on this project in my free time. I still check the issues and do code reviews for Pull Requests which means if you encounter a bug in the program, you should not expect me to fix it as soon as possible, but I'll be very glad to merge your own contributions into the project and release the new version.

I try to label all new issues, so it's easy to find a bug or a feature request to fix/implement, if you are willing to help with the project, you can use the following labels to find issues, just make sure to reply in the issue to let everyone know you took the issue:

Contributors ✨

Thanks goes to these wonderful people (emoji key):

Manuel Rüger
Manuel Rüger

🚧 💻
Egor Kovetskiy
Egor Kovetskiy

🚧 💻
Nick Klauer
Nick Klauer

💻
Rolf Ahrenberg
Rolf Ahrenberg

💻
Charles Southerland
Charles Southerland

💻
Šarūnas Nejus
Šarūnas Nejus

💻
Alexey Baranov
Alexey Baranov

💻
Anthony Barbieri
Anthony Barbieri

💻
Devin Auclair
Devin Auclair

💻
Gezim Sejdiu
Gezim Sejdiu

💻
Josip Ćavar
Josip Ćavar

💻
Juho Saarinen
Juho Saarinen

💻
Luke Fritz
Luke Fritz

💻
Matt Radford
Matt Radford

💻
Planktonette
Planktonette

💻
Stefano Teodorani
Stefano Teodorani

💻
Tim Schrumpf
Tim Schrumpf

💻
Tyler Cole
Tyler Cole

💻
elgreco247
elgreco247

💻
emead-indeed
emead-indeed

💻
Will Hegedus
Will Hegedus

💻
Leandro Carneiro
Leandro Carneiro

💻
beeme1mr
beeme1mr

💻
Taldrain
Taldrain

💻
Hugo Cisneiros
Hugo Cisneiros

💻
jevfok
jevfok

💻
Mateus Miranda
Mateus Miranda

💻
Stephan Hradek
Stephan Hradek

💻
Dreampuf
Dreampuf

💻
Joel Andritsch
Joel Andritsch

💻
guoweis-outreach
guoweis-outreach

💻
klysunkin
klysunkin

💻
Florent Monbillard
Florent Monbillard

💻
Joey Freeland
Joey Freeland

💻
Noam Asor
Noam Asor

💻
Philipp
Philipp

💻
Pommier Vincent
Pommier Vincent

💻
Toru Kawaguchi
Toru Kawaguchi

💻
Will Gorman
Will Gorman

💻
Zackery Griesinger
Zackery Griesinger

💻
cc-chris
cc-chris

💻
datsickkunt
datsickkunt

💻
recrtl
recrtl

💻
Stanislav Seletskiy
Stanislav Seletskiy

💻
Joris Conijn
Joris Conijn

💻

This project follows the all-contributors specification. Contributions of any kind welcome!

Explore related projects