# Migrate Goldmark App V1 To V2

> Migrate your application from goldmark v1 to v2.

- Skill: `yuin/migrate-goldmark-app-v1-to-v2` (Agent Skill)
- Install (CLI): `npx skillmds@latest add yuin/migrate-goldmark-app-v1-to-v2`
- Raw SKILL.md: https://api.skillmd.com/api/skills/yuin/migrate-goldmark-app-v1-to-v2/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: yuin (https://skillmd.com/u/yuin)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/yuin/migrate-goldmark-app-v1-to-v2

---


# migrate-goldmark-app-v1-to-v2
## Description
This skill helps you migrate a goldmark (https://github.com/yuin/goldmark) extension from version 1 to version 2. It
provides guidance on the changes needed to update your project to be compatible with the new version of goldmark.

## Knowledges

- [CommonMark key points](../../references/commonmark-key-points.md) : List of key points of CommonMark spec that you should be aware of when implementing a goldmark extension.
- [Breaking changes in v2](../../references/breaking-changes-in-v2.md) : List of breaking changes in goldmark v2 that you should be aware of when migrating your extension from v1 to v2.

## Migration steps
### Overview of the migration process

- Create a migration plan for the application.
- **MUST** ask human to confirm that the migration plan is acceptable before proceeding with the migration.
- **MUST** ask human to how to test the application after migration before proceeding with the migration.
  - e.g. : "How do you want to test the application after migration? Do you have any test cases or examples that you want to use for testing?"
- Execute the migration plan to update the application code to be compatible with goldmark v2.
- Update the test cases to ensure that the application works as expected with goldmark v2.
- Test the application with goldmark v2 to ensure that it works as expected. If there are any issues, fix them and re-test until the application works as expected.
- Update the documentation to reflect any changes made during the migration process.

### Create a migration plan
#### Task

- Make sure you have read and understood the [Breaking changes in v2](../../references/breaking-changes-in-v2.md) document.
- Make sure you have read and understood the [How to create an extension](./references/how-to-create-an-extension.md) document.
- You create a ./features/goldmark-migration-plan.md file that contains a migration plan for the extension. 

#### Extension

- If the application contains own extensions, you can use `/migrate-goldmark-extension-v1-to-v2` skill to migrate the extensions. 
- If the application contains third-party extensions, you need to check if the extensions provide v2 compatible version.  - If not, **STOP** the migration.

#### Key points to consider when migrating your application
##### goldmark.Markdown alternatives

- In v2, `goldmark.Markdown` is removed. Therefore, you need to replace it with one of the following two patterns:
  - Pattern 1: Use `parser.Parser` and `renderer.Renderer` to create your own `goldmark.Markdown` alternative.
    - Example:
      ```go
      // MarkdownToStringFunc is a function type that converts markdown to HTML.
      type MarkdownToStringFunc func(source string) (string, error)
      
      // NewMarkdownToStringFunc returns a MarkdownToStringFunc that uses the given parser and renderer.
      func NewMarkdownToStringFunc(p parser.Parser, r html.Renderer) MarkdownToStringFunc {
      	return func(source string) (string, error) {
      		var buf bytes.Buffer
      		b := util.StringToReadOnlyBytes(source)
      		doc := p.Parse(b)
      		if err := r.Render(&buf, b, doc); err != nil {
      			return "", err
      		}
      		return buf.String(), nil
      	}
      }
  - Pattern 2: Use `parser.Parser` and `renderer.Renderer` separately.
    - Example:
      ```go
      var buf bytes.Buffer
      p := parser.New(parser.WithAttribute(), parser.WithExtensions(extension.StrikethroughParser))
      r := html.New(html.WithXHTML(), html.WithUnsafe(), html.WithExtensions(extension.StrikethroughHTMLRenderer))
      doc := p.Parse(b)
      err := r.Render(&buf, b, doc)
      ```

##### AST

- In v1, AST values are mostly 'raw' values; entities references and `\` escapes are not resolved. In v2, AST values are resolved values.
  - You need to check if your application relies on the 'raw' values of AST nodes.
    - If your application relies on the resolved values of AST nodes, you should replace `Value.Bytes` and `Value.Str` methods with `Value.Value` method.
    - Otherwise, you should replace `Value.Bytes` and `Value.Str` methods with `Value.Value` method.
- In v2, to make the AST more semantic, some breaking changes have occurred.
  - Please refer to the AST-related section of [Breaking changes in v2](../../references/breaking-changes-in-v2.md).

##### Parsing

- To customize the ID generation, you need to use `parser.IDGenerator` instead of `parser.IDs`.

##### Rendering

- In v2, `renderer.Renderer` has `renderer.Context`; if the application mimics context for rendering, it should be updated to use `renderer.Context`.

