Skip to content


Use mark-magic.config.yaml as the configuration file, the following will explain the basic fields

tasks: # Define a series of tasks
  - name: blog # The name of the task
    input: # Input plugin
      name: '@mark-magic/plugin-joplin' # The name of the input plugin
      config: # Configuration of the input plugin, detailed explanation for each plugin configuration below
    transforms: # Transformation plugins
      - name: '@mark-magic/plugin-doctran' # The name of the input plugin
        config: # Configuration of the plugin
      name: '@mark-magic/plugin-hexo' # The name of the output plugin
      config: # Configuration of the input plugin


Input plugin is used to read data from the data source, such as reading notes from joplin, reading markdown files from local files, etc.

The name of the input plugin, for example, @mark-magic/plugin-joplin.


The configuration of the input plugin, the following will provide a detailed explanation for each plugin configuration.


Transformation plugins can be 0 to multiple.


Output plugin, the configuration is similar to the input plugin.

Environment Variables

If you need to use some confidential configurations, such as cookies or tokens, you can use the ${ENV_NAME} format to use environment variables in the mark-magic.config.yaml configuration file. At the same time, @mark-magic/cli also supports automatically reading .env* configurations in the same directory of the configuration file. You can define environment variables in it and ignore them from .gitignore.

For example, when using the @mark-magic/plugin-joplin plugin

  - name: blog
      name: '@mark-magic/plugin-joplin'
        baseUrl: 'http://localhost:41184'
        token: ${JOPLIN_TOKEN}
        tag: blog

TypeScript Configuration File

In addition to the yaml configuration, you can also use mark-magic.config.ts as the configuration file, but this configuration is only for those who understand TypeScript to try, mainly to quickly support some unsupported plugins. For example, there is currently no vuepress plugin, but it can be quickly implemented and used in the TypeScript configuration file.

import { defineConfig } from '@mark-magic/cli'
import * as joplin from '@mark-magic/plugin-joplin'
import * as local from '@mark-magic/plugin-local'
import { OutputPlugin } from '@mark-magic/core'
import { config } from 'dotenv'
import path from 'path'
import { existsSync } from 'fs'

function vuepress(options: { path: string }): OutputPlugin {
  const plugin = local.output({
    path: options.path,
    contentPath: (it) => path.join(options.path, + '.md'),
    meta: (it) => ({
      date: new Date(it.created).toJSON(),
      tags: it.extra.tags,
  }) = 'vuepress'
  return plugin

if (existsSync('.env.local')) {
  config({ path: '.env.local' })

export default defineConfig({
  tasks: [
      name: 'blog',
      input: joplin.input({
        baseUrl: 'http://localhost:41184',
        token: process.env.JOPLIN_TOKEN!,
        tag: 'blog',
      output: vuepress({
        path: './src/posts',