diff --git a/doc/CHANGELOG.md b/doc/CHANGELOG.md
index 82c404089252b97bc34e50c51eb0fe9db0c2fef9..89040ed3c43b723f781848ef454a932ba29a92a7 100644
--- a/doc/CHANGELOG.md
+++ b/doc/CHANGELOG.md
@@ -5,6 +5,185 @@ SPDX-License-Identifier: CC0-1.0
 SPDX-FileCopyrightText: 2020 Collabora, Ltd. and the Monado contributors
 ```
 
+## Monado 0.3.0 (2020-07-10)
+
+- Major changes
+  - Centralise the logging functionality in Monado to a single util helper.
+    Previously most of our logging was done via fprints and gated behind booleans,
+    now there are common functions to call and a predfined set of levels.
+    ([!408](https://gitlab.freedesktop.org/monado/monado/merge_requests/408),
+    [!409](https://gitlab.freedesktop.org/monado/monado/merge_requests/409))
+- XRT Interface
+  - compositor: Remove the `array_size` field from the struct, this was the only
+    state tracker supplied value that was on the struct, only have values that the
+    compositor decides over on the struct.
+    ([!359](https://gitlab.freedesktop.org/monado/monado/merge_requests/359))
+  - Improve Doxygen documentation of interfaces. Now the inheritance structure and
+    implementation of interfaces is shown in the docs, and helper functions that
+    call through function pointers are listed as "member functions", to help
+    developers understand the internal structure of Monado better.
+    ([!365](https://gitlab.freedesktop.org/monado/monado/merge_requests/365),
+    [!367](https://gitlab.freedesktop.org/monado/monado/merge_requests/367))
+  - xrt: Add xrt_result_t return type to many compositor functions that previously
+    had no way to indicate failure.
+    ([!369](https://gitlab.freedesktop.org/monado/monado/merge_requests/369))
+  - compositor: Introduce `xrt_swapchain_create_info` simplifying the argument
+    passing between various layers of the compositor stack and also simplify future
+    refactoring projects.
+    ([!407](https://gitlab.freedesktop.org/monado/monado/merge_requests/407))
+- State Trackers
+  - OpenXR: Update headers to 1.0.9.
+    ([!358](https://gitlab.freedesktop.org/monado/monado/merge_requests/358))
+  - OpenXR: Verify that the XrViewConfigurationType is supported by the system as
+    required by the OpenXR spec in xrEnumerateEnvironmentBlendModes.
+    ([!359](https://gitlab.freedesktop.org/monado/monado/merge_requests/359))
+  - OpenXR: Return the correct error code when verifying the sub action, if it is
+    a
+    valid sub action path but not given at action creation we should return
+    `XR_ERROR_PATH_UNSUPPORTED`.
+    ([!359](https://gitlab.freedesktop.org/monado/monado/merge_requests/359))
+  - OpenXR: Validate the subImage data for both projection and quad layers layers,
+    refactor code out so it can be shared with the different types of layers. Need
+    to track some state on the `oxr_swapchain` in order to do the checking.
+    ([!359](https://gitlab.freedesktop.org/monado/monado/merge_requests/359))
+  - OpenXR: Correct the return error code for action and action set localized name
+    validation.
+    ([!359](https://gitlab.freedesktop.org/monado/monado/merge_requests/359))
+  - OpenXR: Correct the error messages on sub action paths errors.
+    ([!359](https://gitlab.freedesktop.org/monado/monado/merge_requests/359))
+  - OpenXR: Track the name and localized name for both actions and action sets,
+    that
+    way we can make sure that there are no duplicates. This is required by the
+    spec. ([!359](https://gitlab.freedesktop.org/monado/monado/merge_requests/359))
+  - OpenXR: Do better checking if action sets and actions have been attached to the
+    session or not.
+    ([!359](https://gitlab.freedesktop.org/monado/monado/merge_requests/359))
+  - OpenXR: Validate the arguments for `xrSuggestInteractionProfileBindings` better
+    so that it follows the spec better.
+    ([!359](https://gitlab.freedesktop.org/monado/monado/merge_requests/359))
+  - OpenXR: Rework the logging formatting of error messages, this makes it easier
+    to
+    read for the application developer.
+    ([!359](https://gitlab.freedesktop.org/monado/monado/merge_requests/359))
+  - OpenXR: Correctly ensure that the application has called the required get
+    graphics requirements function when creating a session.
+    ([!359](https://gitlab.freedesktop.org/monado/monado/merge_requests/359))
+  - OpenXR: When a `XrSession` is destroyed purge the event queue of any events
+    that
+    references to it so that no events gets delivered to the applications with
+    stales handles.
+    ([!359](https://gitlab.freedesktop.org/monado/monado/merge_requests/359))
+  - OpenXR: Make the event queue thread safe, all done with a simple mutex that is
+    not held for long at all.
+    ([!359](https://gitlab.freedesktop.org/monado/monado/merge_requests/359))
+  - OpenXR: A major overhaul of the swapchain acquire, wait and release code. This
+    makes it almost completely conformant with the spec. Tricky parts include that
+    multiple images can be acquired, but only one can be waited on before being
+    released.
+    ([!359](https://gitlab.freedesktop.org/monado/monado/merge_requests/359))
+  - OpenXR: Enforce that static swapchains can only be acquired once, this is
+    required by the spec and make sure that a image is only rendered to once, and
+    allows the runtime to perform special optimizations on the image.
+    ([!359](https://gitlab.freedesktop.org/monado/monado/merge_requests/359))
+  - OpenXR: Make the function `xrGetReferenceSpaceBoundsRect` at least conform to
+    the spec without actually implementing it, currently we do not track bounds in
+    Monado.
+    ([!359](https://gitlab.freedesktop.org/monado/monado/merge_requests/359))
+  - OpenXR: Make the session state changes obey the specification. The code is
+    fairly hair as is and should be improved at a later time.
+    ([!359](https://gitlab.freedesktop.org/monado/monado/merge_requests/359))
+  - OpenXR: Use the correct XrPath for `/user/gamepad` while it sits in the users
+    hand itsn't `/user/hand/gamepad` as previously believed.
+    ([!359](https://gitlab.freedesktop.org/monado/monado/merge_requests/359))
+  - OpenXR: Where used make sure we verify the view configuration type is a valid
+    enum value, the code is setup so that we in the future can support new values
+    via extensions easily.
+    ([!368](https://gitlab.freedesktop.org/monado/monado/merge_requests/368))
+  - OpenXR: More correctly verify the interactive profile binding data, including
+    the given interactive profile is correct and the binding point is valid.
+    ([!377](https://gitlab.freedesktop.org/monado/monado/merge_requests/377))
+  - OpenXR: Transform input types in a somewhat flexible, composable way. Also, do
+    conversion at sync time, and use the transformed values to evaluate if the
+    input has changed, per the spec.
+    ([!379](https://gitlab.freedesktop.org/monado/monado/merge_requests/379))
+  - OpenXR: Tidy the extensions generated by the script and order them according
+    to
+    extension prefix, starting with KHR, EXT, Vendor, KHRX, EXTX, VendorX. Also
+    rename the `MND_ball_on_stick_controller` to `MNDX_ball_on_a_stick_controller`.
+    ([!410](https://gitlab.freedesktop.org/monado/monado/merge_requests/410))
+  - OpenXR: Fix overly attached action sets, which would appear to be attached to
+    a
+    session even after the session has been destroyed. Also tidy up comments and
+    other logic surrounding this.
+    ([!411](https://gitlab.freedesktop.org/monado/monado/merge_requests/411))
+- Drivers
+  - psvr: Normalize the rotation to not trip up the client app when it gives the
+    rotation back to `st/oxr` again.
+    ([!359](https://gitlab.freedesktop.org/monado/monado/merge_requests/359))
+  - vive: Create vive_config module to isolate config code and avoid duplication
+    between controller and headset code.
+    vive: Probe for controllers in vive_proper
+    interface.
+    vive: Fix a bug where using the Vive Pro crashed Monado.
+    vive: Fix a
+    bug where the controller didn't parse JSON vectors correctly.
+    vive: Move
+    missing functions to and use u_json.
+    ([!405](https://gitlab.freedesktop.org/monado/monado/merge_requests/405))
+  - vive: Add support for Gen1 and Gen2 Vive Trackers.
+    ([!406](https://gitlab.freedesktop.org/monado/monado/merge_requests/406))
+  - vive: Port to new u_logging API.
+    ([!417](https://gitlab.freedesktop.org/monado/monado/merge_requests/417))
+  - comp: Set a compositor window title.
+    ([!418](https://gitlab.freedesktop.org/monado/monado/merge_requests/418))
+- IPC
+  - server: Almost completely overhaul the handling of swapchain life cycle
+    including: correctly track which swapchains are alive; reuse ids; enforce the
+    maximum number of swapchains; and destroy underlying swapchains when they are
+    destroyed by the client.
+    ([!359](https://gitlab.freedesktop.org/monado/monado/merge_requests/359))
+  - util: Make sure to not access NULL control messages, say in the case of the
+    server failing to create a swapchain. Also add a whole bunch of paranoia when
+    it comes to the alignment of the control message buffers.
+    ([!359](https://gitlab.freedesktop.org/monado/monado/merge_requests/359))
+  - ipc: Return XR_ERROR_INSTANCE_LOST on IPC errors.
+    ([!369](https://gitlab.freedesktop.org/monado/monado/merge_requests/369))
+- Compositor
+  - main: Include `<math.h>` in layers renderer for missing `tanf` function.
+    ([!358](https://gitlab.freedesktop.org/monado/monado/merge_requests/358))
+  - swapchain: Give out the oldset image index when a image is acquired. This logic
+    can be made better, but will work for the good case.
+    ([!359](https://gitlab.freedesktop.org/monado/monado/merge_requests/359))
+  - swapchain: Close any FDs that are still valid, for instance the ipc server
+    copies the FDs to the client.
+    ([!359](https://gitlab.freedesktop.org/monado/monado/merge_requests/359))
+  - client: When we give a image fd to the either OpenGL or Vulkan it is consumed
+    and can not be rused. So make sure that it is set to an invalid fd value on the
+    `xrt_image_fd` on the owning `xrt_swapchain_fd`.
+    ([!359](https://gitlab.freedesktop.org/monado/monado/merge_requests/359))
+  - main: We were alpha blending all layers previously, but now we support the
+    layer flag that OpenXR gives us. We do this by using different `VkImageView`s
+    with different component swizzles.
+    ([!394](https://gitlab.freedesktop.org/monado/monado/merge_requests/394))
+  - layer_rendering: Use the visibility flags on quad to correctly show the layers
+    in each eye.
+    ([!394](https://gitlab.freedesktop.org/monado/monado/merge_requests/394))
+- Helper Libraries
+  - os/threading: Include `xrt_compiler.h` to fix missing stdint types.
+    ([!358](https://gitlab.freedesktop.org/monado/monado/merge_requests/358))
+  - util: Add a very simple fifo for indices, this is used to keep track of
+    swapchain in order of age (oldness).
+    ([!359](https://gitlab.freedesktop.org/monado/monado/merge_requests/359))
+  - util: Expand `u_hashset` to be able to automatically allocate a `u_hashet_item`
+    and insert it.
+    ([!359](https://gitlab.freedesktop.org/monado/monado/merge_requests/359))
+- Misc. Features
+  - build: Allow enabling inter-procedural optimization in CMake GUIs, if supported
+    by platform and compiler.
+    ([!330](https://gitlab.freedesktop.org/monado/monado/merge_requests/330))
+- Misc. Fixes
+  - No significant changes
+
 ## Monado 0.2 (2020-05-29)
 
 - Major changes