diff --git a/early-init.el b/early-init.el
index e8c10d3..6044573 100644
--- a/early-init.el
+++ b/early-init.el
@@ -40,9 +40,9 @@
 
 (setq load-prefer-newer t)
 
-;; Ensure that `describe-package' does not require a
-;; `package-refresh-contents'.
-(setq package-enable-at-startup t)
+;; Make sure that we do not enable `package.el', so that we can use
+;; `elpaca' instead.
+(setq package-enable-at-startup nil)
 
 ;; Name the default frame
 ;; You can select a frame with M-x select-frame-by-name
diff --git a/init.el b/init.el
index 4ba2321..381cea6 100644
--- a/init.el
+++ b/init.el
@@ -25,27 +25,51 @@
    (add-to-list 'load-path (locate-user-emacs-file string)))
  '("unravel-modules" "custom-lisp"))
 
-;;;; Packages
+;;; Install Elpaca
 
-(setq package-vc-register-as-project nil) ; Emacs 30
+(defvar elpaca-installer-version 0.8)
+(defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory))
+(defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory))
+(defvar elpaca-repos-directory (expand-file-name "repos/" elpaca-directory))
+(defvar elpaca-order '(elpaca :repo "https://github.com/progfolio/elpaca.git"
+                              :ref nil :depth 1
+                              :files (:defaults "elpaca-test.el" (:exclude "extensions"))
+                              :build (:not elpaca--activate-package)))
+(let* ((repo  (expand-file-name "elpaca/" elpaca-repos-directory))
+       (build (expand-file-name "elpaca/" elpaca-builds-directory))
+       (order (cdr elpaca-order))
+       (default-directory repo))
+  (add-to-list 'load-path (if (file-exists-p build) build repo))
+  (unless (file-exists-p repo)
+    (make-directory repo t)
+    (when (< emacs-major-version 28) (require 'subr-x))
+    (condition-case-unless-debug err
+        (if-let* ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*"))
+                  ((zerop (apply #'call-process `("git" nil ,buffer t "clone"
+                                                  ,@(when-let* ((depth (plist-get order :depth)))
+                                                      (list (format "--depth=%d" depth) "--no-single-branch"))
+                                                  ,(plist-get order :repo) ,repo))))
+                  ((zerop (call-process "git" nil buffer t "checkout"
+                                        (or (plist-get order :ref) "--"))))
+                  (emacs (concat invocation-directory invocation-name))
+                  ((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch"
+                                        "--eval" "(byte-recompile-directory \".\" 0 'force)")))
+                  ((require 'elpaca))
+                  ((elpaca-generate-autoloads "elpaca" repo)))
+            (progn (message "%s" (buffer-string)) (kill-buffer buffer))
+          (error "%s" (with-current-buffer buffer (buffer-string))))
+      ((error) (warn "%s" err) (delete-directory repo 'recursive))))
+  (unless (require 'elpaca-autoloads nil t)
+    (require 'elpaca)
+    (elpaca-generate-autoloads "elpaca" repo)
+    (load "./elpaca-autoloads")))
+(add-hook 'after-init-hook #'elpaca-process-queues)
+(elpaca `(,@elpaca-order))
 
-(add-hook 'package-menu-mode-hook #'hl-line-mode)
-
-;; Also read: <https://protesilaos.com/codelog/2022-05-13-emacs-elpa-devel/>
-(setq package-archives
-      '(("gnu-elpa" . "https://elpa.gnu.org/packages/")
-        ("gnu-elpa-devel" . "https://elpa.gnu.org/devel/")
-        ("nongnu" . "https://elpa.nongnu.org/nongnu/")
-        ("melpa" . "https://melpa.org/packages/")))
-
-;; Highest number gets priority (what is not mentioned has priority 0)
-(setq package-archive-priorities
-      '(("gnu-elpa" . 3)
-        ("melpa" . 2)
-        ("nongnu" . 1)))
-
-;; Let `package-install' suggest upgrades for built-in packages too.
-(setq package-install-upgrade-built-in t)
+;; Install use-package support for Elpaca
+(elpaca elpaca-use-package
+  ;; Enable use-package :ensure support for Elpaca.
+  (elpaca-use-package-mode))
 
 (defmacro prot-emacs-comment (&rest body)
   "Determine what to do with BODY.
diff --git a/unravel-emacs.org b/unravel-emacs.org
index 31242ae..2aa15d2 100644
--- a/unravel-emacs.org
+++ b/unravel-emacs.org
@@ -137,15 +137,17 @@ by delegating to the =init.el
   (setq load-prefer-newer t)
 #+end_src
 
-** The =early-init.el= initialises the package cache
+** The =early-init.el= package cache settings
 :PROPERTIES:
 :CUSTOM_ID: h:7a037504-8a2f-4df0-8482-ce6476354440
 :END:
 
+Do not initialize the package cache, we want to use ~elpaca~ instead of ~package.el~
+
 #+begin_src emacs-lisp :tangle "early-init.el"
-  ;; Ensure that `describe-package' does not require a
-  ;; `package-refresh-contents'.
-  (setq package-enable-at-startup t)
+  ;; Make sure that we do not enable `package.el', so that we can use
+  ;; `elpaca' instead.
+  (setq package-enable-at-startup nil)
 #+end_src
 
 ** The =early-init.el= gives a name to the default frame
@@ -271,7 +273,7 @@ This is where all the custom configuration sits for all the packages we use. We
    '("unravel-modules" "custom-lisp"))
 #+end_src
 
-** The =init.el= settings for packages (=package.el=)
+** COMMENT The =init.el= settings for packages (=package.el=)
 :PROPERTIES:
 :CUSTOM_ID: h:424340cc-f3d7-4083-93c9-d852d40dfd40
 :END:
@@ -312,6 +314,60 @@ package archives, pinning packages, and setting priorities:
   (setq package-install-upgrade-built-in t)
 #+end_src
 
+** The =init.el= section for using the Elpaca package manager
+:PROPERTIES:
+:CUSTOM_ID: h:13B17ABF-19E3-4723-9B72-E1201F7298AA
+:CREATED:  [2024-12-10 Tue 14:43]
+:END:
+
+#+begin_src emacs-lisp :tangle "init.el"
+  ;;; Install Elpaca
+
+  (defvar elpaca-installer-version 0.8)
+  (defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory))
+  (defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory))
+  (defvar elpaca-repos-directory (expand-file-name "repos/" elpaca-directory))
+  (defvar elpaca-order '(elpaca :repo "https://github.com/progfolio/elpaca.git"
+                                :ref nil :depth 1
+                                :files (:defaults "elpaca-test.el" (:exclude "extensions"))
+                                :build (:not elpaca--activate-package)))
+  (let* ((repo  (expand-file-name "elpaca/" elpaca-repos-directory))
+         (build (expand-file-name "elpaca/" elpaca-builds-directory))
+         (order (cdr elpaca-order))
+         (default-directory repo))
+    (add-to-list 'load-path (if (file-exists-p build) build repo))
+    (unless (file-exists-p repo)
+      (make-directory repo t)
+      (when (< emacs-major-version 28) (require 'subr-x))
+      (condition-case-unless-debug err
+          (if-let* ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*"))
+                    ((zerop (apply #'call-process `("git" nil ,buffer t "clone"
+                                                    ,@(when-let* ((depth (plist-get order :depth)))
+                                                        (list (format "--depth=%d" depth) "--no-single-branch"))
+                                                    ,(plist-get order :repo) ,repo))))
+                    ((zerop (call-process "git" nil buffer t "checkout"
+                                          (or (plist-get order :ref) "--"))))
+                    (emacs (concat invocation-directory invocation-name))
+                    ((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch"
+                                          "--eval" "(byte-recompile-directory \".\" 0 'force)")))
+                    ((require 'elpaca))
+                    ((elpaca-generate-autoloads "elpaca" repo)))
+              (progn (message "%s" (buffer-string)) (kill-buffer buffer))
+            (error "%s" (with-current-buffer buffer (buffer-string))))
+        ((error) (warn "%s" err) (delete-directory repo 'recursive))))
+    (unless (require 'elpaca-autoloads nil t)
+      (require 'elpaca)
+      (elpaca-generate-autoloads "elpaca" repo)
+      (load "./elpaca-autoloads")))
+  (add-hook 'after-init-hook #'elpaca-process-queues)
+  (elpaca `(,@elpaca-order))
+
+  ;; Install use-package support for Elpaca
+  (elpaca elpaca-use-package
+    ;; Enable use-package :ensure support for Elpaca.
+    (elpaca-use-package-mode))
+#+end_src
+
 ** The =init.el= macro to do nothing with Elisp code (~prot-emacs-comment~)
 :PROPERTIES:
 :CUSTOM_ID: h:3b14faa6-83fd-4d5f-b3bc-85f72fd572d4