diff --git a/CHANGES.md b/CHANGES.md
index 615939f..25acd5b 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,7 +1,39 @@
 # Scotty Changelog
 
-## 0.3.0 - unreleased
-- listenbrainz: fetch listens in reverse listen time order
+## 0.4.0 - unreleased
+- JSPF: implement append mode
+- scrobberlog: default for append mode is enabled
+- Subsonic: Only set tags if genre is not empty
+- ListenBrainz: Listen import can be configured to check for duplicate listens
+- spotify-history: New backend for importing from Spotify extended streaming
+  history JSON files
+- Allow date time string for `--timestamp` parameter
+- Fixed completed progress bar showing empty
+
+
+## 0.3.1 - 2023-12-10
+- Prompt user to authenticate after service requiring authentication added
+- Commands service auth, edit and delete now all support `--service` flag
+- Do not apply locale formatting in UI output to Unix timestamps
+- Default for service delete confirmation is now "no"
+- Default for Maloja "nofix" option is now "no"
+- Fixed last stored timestamp for beam loves not getting loaded
+- Fixed crash with invalid target config name in beam commands
+
+
+## 0.3.0 - 2023-12-09
+- Initialize config if it does not exist
+- Set database path relative to config file location
+- Implemented service configuration commands
+- Use positional arguments for source and target in beam commands
+- Allow specifying `--timestamp 0`
+- Subsonic: fixed filtering songs based on timestamp
+- JSPF: add MB playlist extension
+- Spotify: fixed loves export count
+- Deezer: fixed listen export count
+- ListenBrainz: fetch listens in reverse listen time order
+- Initial localization of user interface
+- Documented general configuration and usage
 
 
 ## 0.2.0 - 2023-11-28