diff --git a/CHANGELOG.md b/CHANGELOG.md
deleted file mode 100644
index 39010ea..0000000
--- a/CHANGELOG.md
+++ /dev/null
@@ -1,37 +0,0 @@
-# Changelog
-
-All notable changes to this project will be documented in this file.
-
-The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
-and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
-
-
-## Unreleased
-
-[Compare with latest](https://github.com/seandstewart/python-typelib/compare/ac01975a1a2d50a197716e9d5cfb03be13d26fa9...HEAD)
-
-### Features
-
-- Implement marshallers. ([ed159ef](https://github.com/seandstewart/python-typelib/commit/ed159ef10f90ea4e9a5ea89e3b2c62b03119a08c) by Sean Stewart).
-- Support TypeAliasType ([e235f43](https://github.com/seandstewart/python-typelib/commit/e235f43f0e2322edc90526e6ba6c1af89abb3b7a) by Sean Stewart).
-- Support for cyclic types. ([4422413](https://github.com/seandstewart/python-typelib/commit/44224130f5d129699652c59e6124e3164ffd4192) by Sean Stewart).
-- Defining the unmarshal API. ([8117e0c](https://github.com/seandstewart/python-typelib/commit/8117e0c088c6de024f627e0a5aa17ccb731a68d9) by Sean Stewart).
-- Better generics interface. ([0f96785](https://github.com/seandstewart/python-typelib/commit/0f9678560e7d3c5412704ac43763b94fee8d34ad) by Sean Stewart).
-- Initial pass of complex types for unmarshalling. ([82b566c](https://github.com/seandstewart/python-typelib/commit/82b566c8715a346bde6ac59617b72f0313c0e994) by Sean Stewart).
-- Unmarshallers for initial primitive types. ([1c6aa1c](https://github.com/seandstewart/python-typelib/commit/1c6aa1cead5b73a9da15dc26940e4909703ee4db) by Sean Stewart).
-- Core utilities and graph resolver, with test coverage. ([108faa1](https://github.com/seandstewart/python-typelib/commit/108faa1a845775dbbc43bcf75289f8fc3a6921f1) by Sean Stewart).
-
-### Bug Fixes
-
-- mypy type hinting for non py312 in compat.py ([b36c7d6](https://github.com/seandstewart/python-typelib/commit/b36c7d6d6c6c63496a0cbb041860a57d9f84d1fe) by Sean Stewart).
-- use `datetime.timestamp` when converting date/time to numeric values ([ecdc908](https://github.com/seandstewart/python-typelib/commit/ecdc908c5d380291c25a0560c3b78f760d26d2ee) by Sean Stewart).
-- reliable UTC timestamps for date objects. ([582686d](https://github.com/seandstewart/python-typelib/commit/582686d51970b948249f334404c5bcc8fb8eb321) by Sean Stewart).
-- use compat for future types. ([2e8aa24](https://github.com/seandstewart/python-typelib/commit/2e8aa2442aa60b0ce60d8f72e747f590fcb2a14f) by Sean Stewart).
-- Fix type-hints for lower versions of python ([7c08c8c](https://github.com/seandstewart/python-typelib/commit/7c08c8cc8aa7f144a14479660985b80d3b439c31) by Sean Stewart).
-- Fix type hints for marshalled values ([f4742e0](https://github.com/seandstewart/python-typelib/commit/f4742e0161042304b980bb2c69c3b0de65705eab) by Sean Stewart).
-- Enforce utc for tz-naive datetime.date during number conversion ([afe79fb](https://github.com/seandstewart/python-typelib/commit/afe79fbbafef93fbd9aac9c5eaf146cebb78cb22) by Sean Stewart).
-- The factory function can handle strings/forwardrefs. ([34dd7dd](https://github.com/seandstewart/python-typelib/commit/34dd7dd807e72e5a48b2652898c95c85ccec7110) by Sean Stewart).
-- Tweaking root node assignment. ([6b1f141](https://github.com/seandstewart/python-typelib/commit/6b1f14136e356179c63fb5bd4c38849de493f025) by Sean Stewart).
-- Fix passing var names to unmarshaller ([38c2002](https://github.com/seandstewart/python-typelib/commit/38c2002c6bd0a509a24ca73250bad5403994c620) by Sean Stewart).
-
-
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 120000
index 0000000..1bed66b
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1 @@
+docs/changelog.md
\ No newline at end of file
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
deleted file mode 100644
index 7ae14f3..0000000
--- a/CODE_OF_CONDUCT.md
+++ /dev/null
@@ -1,76 +0,0 @@
-# Contributor Covenant Code of Conduct
-
-## Our Pledge
-
-In the interest of fostering an open and welcoming environment, we as
-contributors and maintainers pledge to making participation in our project and
-our community a harassment-free experience for everyone, regardless of age, body
-size, disability, ethnicity, sex characteristics, gender identity and expression,
-level of experience, education, socio-economic status, nationality, personal
-appearance, race, religion, or sexual identity and orientation.
-
-## Our Standards
-
-Examples of behavior that contributes to creating a positive environment
-include:
-
-* Using welcoming and inclusive language
-* Being respectful of differing viewpoints and experiences
-* Gracefully accepting constructive criticism
-* Focusing on what is best for the community
-* Showing empathy towards other community members
-
-Examples of unacceptable behavior by participants include:
-
-* The use of sexualized language or imagery and unwelcome sexual attention or
- advances
-* Trolling, insulting/derogatory comments, and personal or political attacks
-* Public or private harassment
-* Publishing others' private information, such as a physical or electronic
- address, without explicit permission
-* Other conduct which could reasonably be considered inappropriate in a
- professional setting
-
-## Our Responsibilities
-
-Project maintainers are responsible for clarifying the standards of acceptable
-behavior and are expected to take appropriate and fair corrective action in
-response to any instances of unacceptable behavior.
-
-Project maintainers have the right and responsibility to remove, edit, or
-reject comments, commits, code, wiki edits, issues, and other contributions
-that are not aligned to this Code of Conduct, or to ban temporarily or
-permanently any contributor for other behaviors that they deem inappropriate,
-threatening, offensive, or harmful.
-
-## Scope
-
-This Code of Conduct applies both within project spaces and in public spaces
-when an individual is representing the project or its community. Examples of
-representing a project or community include using an official project e-mail
-address, posting via an official social media account, or acting as an appointed
-representative at an online or offline event. Representation of a project may be
-further defined and clarified by project maintainers.
-
-## Enforcement
-
-Instances of abusive, harassing, or otherwise unacceptable behavior may be
-reported by creating a new issue with the label `conduct-review`. All
-complaints will be reviewed and investigated and will result in a response that
-is deemed necessary and appropriate to the circumstances. The project team is
-obligated to maintain confidentiality with regard to the reporter of an incident.
-Further details of specific enforcement policies may be posted separately.
-
-Project maintainers who do not follow or enforce the Code of Conduct in good
-faith may face temporary or permanent repercussions as determined by other
-members of the project's leadership.
-
-## Attribution
-
-This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
-available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
-
-[homepage]: https://www.contributor-covenant.org
-
-For answers to common questions about this code of conduct, see
-https://www.contributor-covenant.org/faq
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 120000
index 0000000..5e43c9a
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1 @@
+docs/conduct.md
\ No newline at end of file
diff --git a/Makefile b/Makefile
index 6ab3596..f6312a7 100644
--- a/Makefile
+++ b/Makefile
@@ -91,7 +91,7 @@ version ?= $(shell $(VERSION_CMD) | $(SED_CMD) $(DOCS_FILTER))
alias ?= latest
changelog: ## Compile the latest changelog for the current branch.
- @git changelog
+ @git-changelog
@git add CHANGELOG.md
@git commit -m "[skip ci] Update changelog."
.PHONY: changelog
diff --git a/docs/changelog.md b/docs/changelog.md
deleted file mode 120000
index 04c99a5..0000000
--- a/docs/changelog.md
+++ /dev/null
@@ -1 +0,0 @@
-../CHANGELOG.md
\ No newline at end of file
diff --git a/docs/changelog.md b/docs/changelog.md
new file mode 100644
index 0000000..39010ea
--- /dev/null
+++ b/docs/changelog.md
@@ -0,0 +1,37 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
+and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
+
+
+## Unreleased
+
+[Compare with latest](https://github.com/seandstewart/python-typelib/compare/ac01975a1a2d50a197716e9d5cfb03be13d26fa9...HEAD)
+
+### Features
+
+- Implement marshallers. ([ed159ef](https://github.com/seandstewart/python-typelib/commit/ed159ef10f90ea4e9a5ea89e3b2c62b03119a08c) by Sean Stewart).
+- Support TypeAliasType ([e235f43](https://github.com/seandstewart/python-typelib/commit/e235f43f0e2322edc90526e6ba6c1af89abb3b7a) by Sean Stewart).
+- Support for cyclic types. ([4422413](https://github.com/seandstewart/python-typelib/commit/44224130f5d129699652c59e6124e3164ffd4192) by Sean Stewart).
+- Defining the unmarshal API. ([8117e0c](https://github.com/seandstewart/python-typelib/commit/8117e0c088c6de024f627e0a5aa17ccb731a68d9) by Sean Stewart).
+- Better generics interface. ([0f96785](https://github.com/seandstewart/python-typelib/commit/0f9678560e7d3c5412704ac43763b94fee8d34ad) by Sean Stewart).
+- Initial pass of complex types for unmarshalling. ([82b566c](https://github.com/seandstewart/python-typelib/commit/82b566c8715a346bde6ac59617b72f0313c0e994) by Sean Stewart).
+- Unmarshallers for initial primitive types. ([1c6aa1c](https://github.com/seandstewart/python-typelib/commit/1c6aa1cead5b73a9da15dc26940e4909703ee4db) by Sean Stewart).
+- Core utilities and graph resolver, with test coverage. ([108faa1](https://github.com/seandstewart/python-typelib/commit/108faa1a845775dbbc43bcf75289f8fc3a6921f1) by Sean Stewart).
+
+### Bug Fixes
+
+- mypy type hinting for non py312 in compat.py ([b36c7d6](https://github.com/seandstewart/python-typelib/commit/b36c7d6d6c6c63496a0cbb041860a57d9f84d1fe) by Sean Stewart).
+- use `datetime.timestamp` when converting date/time to numeric values ([ecdc908](https://github.com/seandstewart/python-typelib/commit/ecdc908c5d380291c25a0560c3b78f760d26d2ee) by Sean Stewart).
+- reliable UTC timestamps for date objects. ([582686d](https://github.com/seandstewart/python-typelib/commit/582686d51970b948249f334404c5bcc8fb8eb321) by Sean Stewart).
+- use compat for future types. ([2e8aa24](https://github.com/seandstewart/python-typelib/commit/2e8aa2442aa60b0ce60d8f72e747f590fcb2a14f) by Sean Stewart).
+- Fix type-hints for lower versions of python ([7c08c8c](https://github.com/seandstewart/python-typelib/commit/7c08c8cc8aa7f144a14479660985b80d3b439c31) by Sean Stewart).
+- Fix type hints for marshalled values ([f4742e0](https://github.com/seandstewart/python-typelib/commit/f4742e0161042304b980bb2c69c3b0de65705eab) by Sean Stewart).
+- Enforce utc for tz-naive datetime.date during number conversion ([afe79fb](https://github.com/seandstewart/python-typelib/commit/afe79fbbafef93fbd9aac9c5eaf146cebb78cb22) by Sean Stewart).
+- The factory function can handle strings/forwardrefs. ([34dd7dd](https://github.com/seandstewart/python-typelib/commit/34dd7dd807e72e5a48b2652898c95c85ccec7110) by Sean Stewart).
+- Tweaking root node assignment. ([6b1f141](https://github.com/seandstewart/python-typelib/commit/6b1f14136e356179c63fb5bd4c38849de493f025) by Sean Stewart).
+- Fix passing var names to unmarshaller ([38c2002](https://github.com/seandstewart/python-typelib/commit/38c2002c6bd0a509a24ca73250bad5403994c620) by Sean Stewart).
+
+
diff --git a/docs/conduct.md b/docs/conduct.md
deleted file mode 120000
index 0400d57..0000000
--- a/docs/conduct.md
+++ /dev/null
@@ -1 +0,0 @@
-../CODE_OF_CONDUCT.md
\ No newline at end of file
diff --git a/docs/conduct.md b/docs/conduct.md
new file mode 100644
index 0000000..7ae14f3
--- /dev/null
+++ b/docs/conduct.md
@@ -0,0 +1,76 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and maintainers pledge to making participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, sex characteristics, gender identity and expression,
+level of experience, education, socio-economic status, nationality, personal
+appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or
+ advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic
+ address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community. Examples of
+representing a project or community include using an official project e-mail
+address, posting via an official social media account, or acting as an appointed
+representative at an online or offline event. Representation of a project may be
+further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by creating a new issue with the label `conduct-review`. All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. The project team is
+obligated to maintain confidentiality with regard to the reporter of an incident.
+Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good
+faith may face temporary or permanent repercussions as determined by other
+members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
+available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
+
+[homepage]: https://www.contributor-covenant.org
+
+For answers to common questions about this code of conduct, see
+https://www.contributor-covenant.org/faq
diff --git a/pyproject.toml b/pyproject.toml
index 4b09c91..3df4f3a 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -141,8 +141,9 @@ exclude = ".*tests/.*|.*docs/.*"
[tool.git-changelog]
convention = "conventional"
in-place = true
-output = "CHANGELOG.md"
+output = "docs/changelog.md"
parse-refs = true
+parse-trailers = true
[build-system]
requires = ["poetry-core>=1.8.0"]