diff --git a/CHANGELOG.md b/CHANGELOG.md
index c3765a23..0237b0d8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,7 +4,7 @@ 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](https://semver.org/spec/v2.0.0.html).
 
-## [Unreleased]
+## [0.3.0] - 2024-12-16
 
 ### Breaking Changes
 
@@ -19,17 +19,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - `register_custom_getrandom!` macro [#504]
 - Implementation of `From<NonZeroU32>` for `Error` and `Error::code` method [#507]
 - Internet Explorer 11 support [#554]
+- Target-specific assocciated `Error` constants [#562]
 
 ### Changed
-- Use `ProcessPrng` on Windows 10 and up, and use RtlGenRandom on older legacy Windows versions [#415]
+- Use `ProcessPrng` on Windows 10 and up, and use `RtlGenRandom` on older Windows versions [#415]
 - Do not use locale-specific `strerror_r` for retrieving error code descriptions [#440]
-- Avoid assuming usize is the native word size in the `rdrand` backend [#442]
+- Avoid assuming `usize` is the native word size in the `rdrand` backend [#442]
 - Do not read from `errno` when `libc` did not indicate error on Solaris [#448]
 - Switch from `libpthread`'s mutex to `futex` on Linux and to `nanosleep`-based wait loop
   on other targets in the `use_file` backend [#490]
 - Do not retry on `EAGAIN` while polling `/dev/random` on Linux [#522]
-- Remove separate codepath for Node.js in the `wasm_js` backend (bumps minimum supported Node.js
-  version to v19) [#557]
+- Remove separate codepath for Node.js in the `wasm_js` backend
+  (bumps minimum supported Node.js version to v19) [#557]
+- Use `js_namespace` in the `wasm_js` backend [#559]
  
 ### Added
 - `wasm32-wasip1` and `wasm32-wasip2` support [#499]
@@ -38,6 +40,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - `rndr` opt-in backend [#512]
 - Automatic MemorySanitizer support [#521] [#571]
 - `u32` and `u64` functions for generating random values of the respective type [#544]
+- `wasm32v1-none` support in the `wasm_js` backend [#560]
+- `wasm_js` crate feature which allows users to enable the `wasm_js` opt-in backend [#574]
 
 ### Fixed
 - NetBSD fallback code based on `KERN_ARND` [#555]
@@ -59,7 +63,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 [#554]: https://github.com/rust-random/getrandom/pull/554
 [#555]: https://github.com/rust-random/getrandom/pull/555
 [#557]: https://github.com/rust-random/getrandom/pull/557
+[#559]: https://github.com/rust-random/getrandom/pull/559
+[#560]: https://github.com/rust-random/getrandom/pull/560
+[#562]: https://github.com/rust-random/getrandom/pull/562
 [#571]: https://github.com/rust-random/getrandom/pull/571
+[#574]: https://github.com/rust-random/getrandom/pull/574
 
 ## [0.2.15] - 2024-05-06
 ### Added
@@ -511,6 +519,7 @@ Publish initial implementation.
 ## [0.0.0] - 2019-01-19
 Publish an empty template library.
 
+[0.3.0]: https://github.com/rust-random/getrandom/compare/v0.2.15...v0.3.0
 [0.2.15]: https://github.com/rust-random/getrandom/compare/v0.2.14...v0.2.15
 [0.2.14]: https://github.com/rust-random/getrandom/compare/v0.2.13...v0.2.14
 [0.2.13]: https://github.com/rust-random/getrandom/compare/v0.2.12...v0.2.13
diff --git a/Cargo.toml b/Cargo.toml
index 8e6d0e6a..9d130e32 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "getrandom"
-version = "0.3.0-rc.0"
+version = "0.3.0"
 edition = "2021"
 rust-version = "1.63" # Sync tests.yml and README.md.
 authors = ["The Rand Project Developers"]