diff --git a/early-init.el b/early-init.el
new file mode 100644
index 0000000..b39f4e2
--- /dev/null
+++ b/early-init.el
@@ -0,0 +1,24 @@
+;;; No GUI
+(dolist (mode '(menu-bar-mode tool-bar-mode scroll-bar-mode))
+  (when (fboundp mode) (funcall mode -1)))
+
+;; A big contributor to startup times is garbage collection.
+
+;; We up the gc threshold to temporarily prevent it from running, then
+;; reset it later by enabling `gcmh-mode'. Not resetting it will cause
+;; stuttering/freezes.
+
+(setq gc-cons-threshold most-positive-fixnum)
+
+;; When both .el and .elc / .eln files are available,
+;; load the latest one.
+
+(setq load-prefer-newer t)
+
+;; Ensure that `describe-package' does not require a
+;; `package-refresh-contents'.
+(setq package-enable-at-startup t)
+
+;; Name the default frame
+;; You can select a frame with M-x select-frame-by-name
+(add-hook 'after-init-hook (lambda () (set-frame-name "unravel")))
diff --git a/init.el b/init.el
new file mode 100644
index 0000000..27a7e27
--- /dev/null
+++ b/init.el
@@ -0,0 +1,56 @@
+;; Make native compilation silent and prune its cache.
+(when (native-comp-available-p)
+  (setq native-comp-async-report-warnings-errors 'silent) ; Emacs 28 with native compilation
+  (setq native-compile-prune-cache t)) ; Emacs 29
+
+;; Disable custom.el by making it disposable.
+(setq custom-file (make-temp-file "emacs-custom-"))
+
+;; Enable these commands which have been disabled by default
+(mapc
+ (lambda (command)
+   (put command 'disabled nil))
+ '(list-timers narrow-to-region narrow-to-page upcase-region downcase-region))
+
+;; Disable these commands which have been enabled by default
+(mapc
+ (lambda (command)
+   (put command 'disabled t))
+ '(eshell project-eshell overwrite-mode iconify-frame diary))
+
+(mapc
+ (lambda (string)
+   (add-to-list 'load-path (locate-user-emacs-file string)))
+ '("unravel-modules"))
+
+;;;; Packages
+
+(setq package-vc-register-as-project nil) ; Emacs 30
+
+(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)))
+
+(setq package-install-upgrade-built-in t)
+
+(require 'unravel-theme)
+;; (require 'unravel-essentials)
+;; (require 'unravel-modeline)
+;; (require 'unravel-completion)
+;; (require 'unravel-search)
+;; (require 'unravel-dired)
+;; (require 'unravel-window)
+;; (require 'unravel-git)
+;; (require 'unravel-org)
+;; (require 'unravel-langs)
diff --git a/unravel-modules/unravel-theme.el b/unravel-modules/unravel-theme.el
new file mode 100644
index 0000000..36f7572
--- /dev/null
+++ b/unravel-modules/unravel-theme.el
@@ -0,0 +1,257 @@
+;;; Everything related to the look of Emacs
+
+;;; The Ef (εὖ) themes
+
+;; The themes are customisable.  Read the manual:
+;; <https://protesilaos.com/emacs/ef-themes>.
+(use-package ef-themes
+  :ensure t
+  :demand t
+  :bind
+  (("<f5>" . ef-themes-rotate)
+   ("C-<f5>" . ef-themes-select))
+  :config
+  (setq ef-themes-to-toggle '(ef-elea-light ef-elea-dark)
+        ef-themes-variable-pitch-ui t
+        ef-themes-mixed-fonts t
+        ef-themes-headings ; read the manual's entry of the doc string
+        '((0 . (variable-pitch light 1.9))
+          (1 . (variable-pitch light 1.8))
+          (2 . (variable-pitch regular 1.7))
+          (3 . (variable-pitch regular 1.6))
+          (4 . (variable-pitch regular 1.5))
+          (5 . (variable-pitch 1.4)) ; absence of weight means `bold'
+          (6 . (variable-pitch 1.3))
+          (7 . (variable-pitch 1.2))
+          (agenda-date . (semilight 1.5))
+          (agenda-structure . (variable-pitch light 1.9))
+          (t . (variable-pitch 1.1))))
+
+  (ef-themes-select 'ef-elea-light))
+
+;;;; Lin
+;; Read the lin manual: <https://protesilaos.com/emacs/lin>.
+(use-package lin
+  :ensure t
+  :hook (after-init . lin-global-mode) ; applies to all `lin-mode-hooks'
+  :config
+  (setopt lin-face 'lin-cyan))
+
+;;;; Increase padding of windows/frames
+;; <https://protesilaos.com/codelog/2023-06-03-emacs-spacious-padding/>.
+(use-package spacious-padding
+  :ensure t
+  :if (display-graphic-p)
+  :hook (after-init . spacious-padding-mode)
+  :init
+  ;; These are the defaults, but I keep it here for visiibility.
+  (setq spacious-padding-widths
+        '(:internal-border-width 30
+          :header-line-width 4
+          :mode-line-width 6
+          :tab-width 4
+          :right-divider-width 30
+          :scroll-bar-width 8
+          :left-fringe-width 20
+          :right-fringe-width 20))
+
+  ;; Read the doc string of `spacious-padding-subtle-mode-line' as
+  ;; it is very flexible.
+  (setq spacious-padding-subtle-mode-line t))
+
+;;; Cursor appearance (cursory)
+;; Read the manual: <https://protesilaos.com/emacs/cursory>.
+(use-package cursory
+  :ensure t
+  :demand t
+  :if (display-graphic-p)
+  :config
+  (setq cursory-presets
+        '((box
+           :blink-cursor-interval 1.2)
+          (box-no-blink
+           :blink-cursor-mode -1)
+          (bar
+           :cursor-type (bar . 2)
+           :blink-cursor-interval 0.8)
+          (bar-no-other-window
+           :inherit bar
+           :cursor-in-non-selected-windows nil)
+          (bar-no-blink
+           :cursor-type (bar . 2)
+           :blink-cursor-mode -1)
+          (underscore
+           :cursor-type (hbar . 3)
+           :blink-cursor-interval 0.3
+           :blink-cursor-blinks 50)
+          (underscore-no-other-window
+           :inherit underscore
+           :cursor-in-non-selected-windows nil)
+          (underscore-thick
+           :cursor-type (hbar . 8)
+           :blink-cursor-interval 0.3
+           :blink-cursor-blinks 50
+           :cursor-in-non-selected-windows (hbar . 3))
+          (underscore-thick-no-blink
+           :blink-cursor-mode -1
+           :cursor-type (hbar . 8)
+           :cursor-in-non-selected-windows (hbar . 3))
+          (t ; the default values
+           :cursor-type box
+           :cursor-in-non-selected-windows hollow
+           :blink-cursor-mode 1
+           :blink-cursor-blinks 10
+           :blink-cursor-interval 0.2
+           :blink-cursor-delay 0.2)))
+
+  ;; I am using the default values of `cursory-latest-state-file'.
+
+  ;; Set last preset or fall back to desired style from `cursory-presets'.
+  (cursory-set-preset (or (cursory-restore-latest-preset) 'box))
+
+  (cursory-mode 1))
+
+;;;; Theme buffet
+;; <https://git.sr.ht/~bboal/theme-buffet>
+(use-package theme-buffet
+  :ensure t
+  :after (:any modus-themes ef-themes)
+  :defer 1
+  :config
+  (let ((modus-themes-p (featurep 'modus-themes))
+        (ef-themes-p (featurep 'ef-themes)))
+    (setq theme-buffet-menu 'end-user)
+    (setq theme-buffet-time-offset 5)
+    (setq theme-buffet-end-user
+          '(:night     (ef-dark ef-winter ef-autumn ef-night ef-duo-dark ef-symbiosis ef-owl)
+            :morning   (ef-light ef-cyprus ef-spring ef-frost ef-duo-light ef-eagle)
+            :afternoon (ef-arbutus ef-day ef-kassio ef-summer ef-elea-light ef-maris-light ef-melissa-light ef-trio-light ef-reverie)
+            :evening   (ef-rosa ef-elea-dark ef-maris-dark ef-melissa-dark ef-trio-dark ef-dream)))
+
+    (when (or modus-themes-p ef-themes-p)
+      (theme-buffet-timer-hours 2))))
+
+;;;; Fontaine (font configurations)
+;; Read the manual: <https://protesilaos.com/emacs/fontaine>
+(use-package fontaine
+  :ensure t
+  :if (display-graphic-p)
+  :hook
+  ;; Persist the latest font preset when closing/starting Emacs and
+  ;; while switching between themes.
+  ((after-init . fontaine-mode)
+   (after-init . (lambda ()
+                   ;; Set last preset or fall back to desired style from `fontaine-presets'.
+                   (fontaine-set-preset (or (fontaine-restore-latest-preset) 'regular)))))
+  :config
+  ;; This is defined in Emacs C code: it belongs to font settings.
+  (setq x-underline-at-descent-line nil)
+
+  ;; And this is for Emacs28.
+  (setq-default text-scale-remap-header-line t)
+
+  ;; This is the default value.  Just including it here for
+  ;; completeness.
+  (setq fontaine-latest-state-file (locate-user-emacs-file "fontaine-latest-state.eld"))
+
+  (setq fontaine-presets
+        '((small
+           :default-height 80)
+          (regular) ; like this it uses all the fallback values and is named `regular'
+          (medium
+           :default-weight semilight
+           :default-height 115
+           :bold-weight extrabold)
+          (large
+           :inherit medium
+           :default-height 150)
+          (live-stream
+           :default-family "Iosevka Comfy Wide Motion"
+           :default-height 150
+           :default-weight medium
+           :fixed-pitch-family "Iosevka Comfy Wide Motion"
+           :variable-pitch-family "Iosevka Comfy Wide Duo"
+           :bold-weight extrabold)
+          (presentation
+           :default-height 180)
+          (jumbo
+           :default-height 260)
+          (t
+           ;; I keep all properties for didactic purposes, but most can be
+           ;; omitted.  See the fontaine manual for the technicalities:
+           ;; <https://protesilaos.com/emacs/fontaine>.
+           :default-family "Iosevka Comfy"
+           :default-weight regular
+           :default-slant normal
+           :default-width normal
+           :default-height 100
+
+           :fixed-pitch-family "Iosevka Comfy"
+           :fixed-pitch-weight nil
+           :fixed-pitch-slant nil
+           :fixed-pitch-width nil
+           :fixed-pitch-height 1.0
+
+           :fixed-pitch-serif-family nil
+           :fixed-pitch-serif-weight nil
+           :fixed-pitch-serif-slant nil
+           :fixed-pitch-serif-width nil
+           :fixed-pitch-serif-height 1.0
+
+           :variable-pitch-family "Iosevka Comfy Motion Duo"
+           :variable-pitch-weight nil
+           :variable-pitch-slant nil
+           :variable-pitch-width nil
+           :variable-pitch-height 1.0
+
+           :mode-line-active-family nil
+           :mode-line-active-weight nil
+           :mode-line-active-slant nil
+           :mode-line-active-width nil
+           :mode-line-active-height 1.0
+
+           :mode-line-inactive-family nil
+           :mode-line-inactive-weight nil
+           :mode-line-inactive-slant nil
+           :mode-line-inactive-width nil
+           :mode-line-inactive-height 1.0
+
+           :header-line-family nil
+           :header-line-weight nil
+           :header-line-slant nil
+           :header-line-width nil
+           :header-line-height 1.0
+
+           :line-number-family nil
+           :line-number-weight nil
+           :line-number-slant nil
+           :line-number-width nil
+           :line-number-height 1.0
+
+           :tab-bar-family nil
+           :tab-bar-weight nil
+           :tab-bar-slant nil
+           :tab-bar-width nil
+           :tab-bar-height 1.0
+
+           :tab-line-family nil
+           :tab-line-weight nil
+           :tab-line-slant nil
+           :tab-line-width nil
+           :tab-line-height 1.0
+
+           :bold-family nil
+           :bold-slant nil
+           :bold-weight bold
+           :bold-width nil
+           :bold-height 1.0
+
+           :italic-family nil
+           :italic-weight nil
+           :italic-slant italic
+           :italic-width nil
+           :italic-height 1.0
+
+           :line-spacing nil))))
+
+(provide 'unravel-theme)