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:
+(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:
+;; .
+(use-package ef-themes
+ :ensure t
+ :demand t
+ :bind
+ (("" . ef-themes-rotate)
+ ("C-" . 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: .
+(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
+;; .
+(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: .
+(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
+;;
+(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:
+(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:
+ ;; .
+ :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)