EditorsNeeds Emacs 27.1+
Emacs
Three themes in one package, covering the tree-sitter font-lock faces, org, magit, diff and ediff, vertico, corfu, company, helm, treemacs, lsp-ui, doom-modeline and more. To install straight from GitHub instead of copying files, use (use-package subway-seat-theme :vc (:url "https://github.com/oddurs/subway-seat" :lisp-dir "dist/emacs" :rev :newest)) on Emacs 30+, or (package-vc-install '(subway-seat-theme :url "https://github.com/oddurs/subway-seat" :lisp-dir "dist/emacs")) on Emacs 29, then (load-theme 'subway-seat t).
Showing WalnutTunnelEnamelMoquetteDeep LevelPortlandGuimardCatacombesCarrelage. Switch flavors with the bullets up top.
Emacs Report a problem with this portReport a problem with this portReport a problem with this portReport a problem with this portReport a problem with this portReport a problem with this portReport a problem with this portReport a problem with this portReport a problem with this port
The quick way
The installer sets it up for you, then tells you the one thing it can't do. More ways to install
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor walnut --only emacs
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor tunnel --only emacs
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor enamel --only emacs
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor moquette --only emacs
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor deep --only emacs
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor portland --only emacs
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor guimard --only emacs
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor catacombes --only emacs
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor carrelage --only emacs
Turn it on
(add-to-list 'load-path "~/.config/emacs/themes/")
(add-to-list 'custom-theme-load-path "~/.config/emacs/themes/")
(load-theme 'subway-seat t)(add-to-list 'load-path "~/.config/emacs/themes/")
(add-to-list 'custom-theme-load-path "~/.config/emacs/themes/")
(load-theme 'subway-seat-tunnel t)(add-to-list 'load-path "~/.config/emacs/themes/")
(add-to-list 'custom-theme-load-path "~/.config/emacs/themes/")
(load-theme 'subway-seat-enamel t)(add-to-list 'load-path "~/.config/emacs/themes/")
(add-to-list 'custom-theme-load-path "~/.config/emacs/themes/")
(load-theme 'london-moquette t)(add-to-list 'load-path "~/.config/emacs/themes/")
(add-to-list 'custom-theme-load-path "~/.config/emacs/themes/")
(load-theme 'london-deep-level t)(add-to-list 'load-path "~/.config/emacs/themes/")
(add-to-list 'custom-theme-load-path "~/.config/emacs/themes/")
(load-theme 'london-portland t)(add-to-list 'load-path "~/.config/emacs/themes/")
(add-to-list 'custom-theme-load-path "~/.config/emacs/themes/")
(load-theme 'paris-guimard t)(add-to-list 'load-path "~/.config/emacs/themes/")
(add-to-list 'custom-theme-load-path "~/.config/emacs/themes/")
(load-theme 'paris-catacombes t)(add-to-list 'load-path "~/.config/emacs/themes/")
(add-to-list 'custom-theme-load-path "~/.config/emacs/themes/")
(load-theme 'paris-carrelage t)Follow light and dark
One setting that changes with your system’s light and dark mode, no switching by hand.
(use-package auto-dark
:ensure t
:custom (auto-dark-themes '((subway-seat) (subway-seat-enamel)))
:init (auto-dark-mode))The files
subway-seat-theme.elsave as ~/.config/emacs/themes/subway-seat-theme.el;;; subway-seat-theme.el --- A warm 1970s subway-car color theme -*- lexical-binding: t; -*-
;; Copyright (C) 2026 Oddur Sigurdsson
;; Author: Oddur Sigurdsson
;; URL: https://github.com/oddurs/subway-seat
;; Version: 0.3.0
;; Package-Requires: ((emacs "27.1"))
;; Keywords: faces, theme
;; SPDX-License-Identifier: MIT
;; This file is not part of GNU Emacs.
;; Permission is hereby granted, free of charge, to any person obtaining a copy
;; of this software and associated documentation files (the "Software"), to deal
;; in the Software without restriction, including without limitation the rights
;; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
;; copies of the Software, and to permit persons to whom the Software is
;; furnished to do so, subject to the following conditions:
;;
;; The above copyright notice and this permission notice shall be included in all
;; copies or substantial portions of the Software.
;;
;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
;; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
;; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
;; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
;; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
;; SOFTWARE.
;;; Commentary:
;; Subway Seat: walnut-brown ground, parchment text, harvest gold, burnt
;; orange, avocado, sage and faded denim -- a 1970s subway car with shag
;; carpet, kept relaxed. Three themes share one palette table and one face
;; list:
;;
;; `subway-seat' Walnut, the original dark
;; `subway-seat-tunnel' Tunnel, a deeper dark
;; `subway-seat-enamel' Enamel, the light one
;;
;; Put the three files in one folder on `load-path' and
;; `custom-theme-load-path' (or install the package), then enable one with
;;
;; (load-theme 'subway-seat t)
;;
;; To tweak a face with the theme's colors, bind them with
;; `subway-seat-theme-with-colors':
;;
;; (subway-seat-theme-with-colors 'subway-seat
;; (set-face-attribute 'hl-line nil :background .surface1))
;;
;; Subway Seat — generated from palette.py by build.py. Edit the palette, not this file.
;;; Code:
(defgroup subway-seat-theme nil
"The Subway Seat color themes."
:group 'faces
:prefix "subway-seat-theme-"
:link '(url-link "https://github.com/oddurs/subway-seat"))
(defconst subway-seat-theme-palettes
'(
(subway-seat
(crust . "#20160E")
(mantle . "#2A1D13")
(base . "#362619")
(surface0 . "#43301F")
(surface1 . "#513B27")
(surface2 . "#634932")
(overlay0 . "#7B6047")
(overlay1 . "#967B5C")
(overlay2 . "#AE9575")
(subtext0 . "#C4AE8C")
(subtext1 . "#D9C6A3")
(text . "#EDDCBC")
(text-hi . "#F8ECD4")
(yellow . "#F3BF45")
(yellow-hi . "#FFD36B")
(orange . "#EC7F31")
(orange-hi . "#FF9D55")
(red . "#E05C45")
(red-hi . "#FF8373")
(green . "#ADB956")
(green-hi . "#BFCB63")
(sage . "#86AD95")
(sage-hi . "#A5C9B0")
(denim . "#7F9BAE")
(denim-hi . "#9DB6C6")
(clay . "#F4A87E")
(ink . "#20160E")
(cursor . "#F3BF45")
(hl-line . "#43301F")
(region . "#634932")
(region-inactive . "#4F3927")
(line-nr . "#7B6047")
(line-nr-cur . "#F3BF45")
(bracket . "#FFD36B")
(bracket-bg . "#513B27")
(paper . "#43301F")
(edge . "#584532")
(row . "#584532")
(bg-add . "#3F3A1E")
(bg-add-hl . "#454121")
(bg-add-emph . "#504D26")
(bg-del . "#52281C")
(bg-del-hl . "#5B2C1F")
(bg-del-emph . "#6D3224")
(bg-chg . "#423117")
(bg-chg-emph . "#57421C")
(bg-error . "#4A2C1E")
(bg-warning . "#49351D")
(bg-info . "#40362E")
(bg-hint . "#41392A")
(bg-search . "#6F5426")
(bg-search-cur . "#915225")
(bg-inlay . "#3E2C1D")
(ansi0 . "#513B27")
(ansi1 . "#E05C45")
(ansi2 . "#ADB956")
(ansi3 . "#F3BF45")
(ansi4 . "#7F9BAE")
(ansi5 . "#EC7F31")
(ansi6 . "#86AD95")
(ansi7 . "#D9C6A3")
(ansi8 . "#967B5C")
(ansi9 . "#FF8373")
(ansi10 . "#BFCB63")
(ansi11 . "#FFD36B")
(ansi12 . "#9DB6C6")
(ansi13 . "#FF9D55")
(ansi14 . "#A5C9B0")
(ansi15 . "#F8ECD4"))
(subway-seat-tunnel
(crust . "#140D07")
(mantle . "#1B120A")
(base . "#24180E")
(surface0 . "#302115")
(surface1 . "#3D2C1D")
(surface2 . "#4F3927")
(overlay0 . "#745B45")
(overlay1 . "#917759")
(overlay2 . "#AA9171")
(subtext0 . "#C0AA88")
(subtext1 . "#D6C3A0")
(text . "#E9D8B6")
(text-hi . "#F6EAD1")
(yellow . "#F3BF45")Showing 150 of 1,514 lines.
subway-seat-tunnel-theme.elsave as ~/.config/emacs/themes/subway-seat-tunnel-theme.elneeds subway-seat-theme.el in the same folder
;;; subway-seat-tunnel-theme.el --- Subway Seat Tunnel, the Tunnel flavor -*- lexical-binding: t; -*-
;; Copyright (C) 2026 Oddur Sigurdsson
;; Author: Oddur Sigurdsson
;; URL: https://github.com/oddurs/subway-seat
;; Version: 0.3.0
;; Package-Requires: ((emacs "27.1"))
;; SPDX-License-Identifier: MIT
;; This file is not part of GNU Emacs.
;;; Commentary:
;; The late local after midnight: espresso-deep, same warm lights.
;; The palette and faces live in subway-seat-theme.el; this file lets
;; `load-theme' find `subway-seat-tunnel'.
;;
;; Subway Seat — generated from palette.py by build.py. Edit the palette, not this file.
;;; Code:
(require 'subway-seat-theme)
(deftheme subway-seat-tunnel
"Subway Seat Tunnel: The late local after midnight: espresso-deep, same warm lights.")
;; `load-theme' clears a theme's settings before loading its file, so record them again.
(subway-seat-theme-apply 'subway-seat-tunnel)
(provide-theme 'subway-seat-tunnel)
;;; subway-seat-tunnel-theme.el ends heresubway-seat-enamel-theme.elsave as ~/.config/emacs/themes/subway-seat-enamel-theme.elneeds subway-seat-theme.el in the same folder
;;; subway-seat-enamel-theme.el --- Subway Seat Enamel, the Enamel flavor -*- lexical-binding: t; -*-
;; Copyright (C) 2026 Oddur Sigurdsson
;; Author: Oddur Sigurdsson
;; URL: https://github.com/oddurs/subway-seat
;; Version: 0.3.0
;; Package-Requires: ((emacs "27.1"))
;; SPDX-License-Identifier: MIT
;; This file is not part of GNU Emacs.
;;; Commentary:
;; Cream enamel panels in the morning sun. The light one.
;; The palette and faces live in subway-seat-theme.el; this file lets
;; `load-theme' find `subway-seat-enamel'.
;;
;; Subway Seat — generated from palette.py by build.py. Edit the palette, not this file.
;;; Code:
(require 'subway-seat-theme)
(deftheme subway-seat-enamel
"Subway Seat Enamel: Cream enamel panels in the morning sun. The light one.")
;; `load-theme' clears a theme's settings before loading its file, so record them again.
(subway-seat-theme-apply 'subway-seat-enamel)
(provide-theme 'subway-seat-enamel)
;;; subway-seat-enamel-theme.el ends herelondon-moquette-theme.elsave as ~/.config/emacs/themes/london-moquette-theme.elneeds subway-seat-theme.el in the same folder
;;; london-moquette-theme.el --- London Moquette, the Moquette flavor -*- lexical-binding: t; -*-
;; Copyright (C) 2026 Oddur Sigurdsson
;; Author: Oddur Sigurdsson
;; URL: https://github.com/oddurs/subway-seat
;; Version: 0.3.0
;; Package-Requires: ((emacs "27.1"))
;; SPDX-License-Identifier: MIT
;; This file is not part of GNU Emacs.
;;; Commentary:
;; The seat you're sitting on. Corporate Blue, turned right down.
;; The palette and faces live in subway-seat-theme.el; this file lets
;; `load-theme' find `london-moquette'.
;;
;; Subway Seat — generated from palette.py by build.py. Edit the palette, not this file.
;;; Code:
(require 'subway-seat-theme)
(deftheme london-moquette
"London Moquette: The seat you're sitting on. Corporate Blue, turned right down.")
;; `load-theme' clears a theme's settings before loading its file, so record them again.
(subway-seat-theme-apply 'london-moquette)
(provide-theme 'london-moquette)
;;; london-moquette-theme.el ends herelondon-deep-level-theme.elsave as ~/.config/emacs/themes/london-deep-level-theme.elneeds subway-seat-theme.el in the same folder
;;; london-deep-level-theme.el --- London Deep Level, the Deep flavor -*- lexical-binding: t; -*-
;; Copyright (C) 2026 Oddur Sigurdsson
;; Author: Oddur Sigurdsson
;; URL: https://github.com/oddurs/subway-seat
;; Version: 0.3.0
;; Package-Requires: ((emacs "27.1"))
;; SPDX-License-Identifier: MIT
;; This file is not part of GNU Emacs.
;;; Commentary:
;; Below the cut-and-cover lines. The ground drops; the signals don't.
;; The palette and faces live in subway-seat-theme.el; this file lets
;; `load-theme' find `london-deep-level'.
;;
;; Subway Seat — generated from palette.py by build.py. Edit the palette, not this file.
;;; Code:
(require 'subway-seat-theme)
(deftheme london-deep-level
"London Deep Level: Below the cut-and-cover lines. The ground drops; the signals don't.")
;; `load-theme' clears a theme's settings before loading its file, so record them again.
(subway-seat-theme-apply 'london-deep-level)
(provide-theme 'london-deep-level)
;;; london-deep-level-theme.el ends herelondon-portland-theme.elsave as ~/.config/emacs/themes/london-portland-theme.elneeds subway-seat-theme.el in the same folder
;;; london-portland-theme.el --- London Portland, the Portland flavor -*- lexical-binding: t; -*-
;; Copyright (C) 2026 Oddur Sigurdsson
;; Author: Oddur Sigurdsson
;; URL: https://github.com/oddurs/subway-seat
;; Version: 0.3.0
;; Package-Requires: ((emacs "27.1"))
;; SPDX-License-Identifier: MIT
;; This file is not part of GNU Emacs.
;;; Commentary:
;; Holden's Portland stone. Links are the exact Corporate Blue.
;; The palette and faces live in subway-seat-theme.el; this file lets
;; `load-theme' find `london-portland'.
;;
;; Subway Seat — generated from palette.py by build.py. Edit the palette, not this file.
;;; Code:
(require 'subway-seat-theme)
(deftheme london-portland
"London Portland: Holden's Portland stone. Links are the exact Corporate Blue.")
;; `load-theme' clears a theme's settings before loading its file, so record them again.
(subway-seat-theme-apply 'london-portland)
(provide-theme 'london-portland)
;;; london-portland-theme.el ends hereparis-guimard-theme.elsave as ~/.config/emacs/themes/paris-guimard-theme.elneeds subway-seat-theme.el in the same folder
;;; paris-guimard-theme.el --- Paris Guimard, the Guimard flavor -*- lexical-binding: t; -*-
;; Copyright (C) 2026 Oddur Sigurdsson
;; Author: Oddur Sigurdsson
;; URL: https://github.com/oddurs/subway-seat
;; Version: 0.3.0
;; Package-Requires: ((emacs "27.1"))
;; SPDX-License-Identifier: MIT
;; This file is not part of GNU Emacs.
;;; Commentary:
;; Cast iron off a Metro entrance, which is nearly black. Brass leads.
;; The palette and faces live in subway-seat-theme.el; this file lets
;; `load-theme' find `paris-guimard'.
;;
;; Subway Seat — generated from palette.py by build.py. Edit the palette, not this file.
;;; Code:
(require 'subway-seat-theme)
(deftheme paris-guimard
"Paris Guimard: Cast iron off a Metro entrance, which is nearly black. Brass leads.")
;; `load-theme' clears a theme's settings before loading its file, so record them again.
(subway-seat-theme-apply 'paris-guimard)
(provide-theme 'paris-guimard)
;;; paris-guimard-theme.el ends hereparis-catacombes-theme.elsave as ~/.config/emacs/themes/paris-catacombes-theme.elneeds subway-seat-theme.el in the same folder
;;; paris-catacombes-theme.el --- Paris Catacombes, the Catacombes flavor -*- lexical-binding: t; -*-
;; Copyright (C) 2026 Oddur Sigurdsson
;; Author: Oddur Sigurdsson
;; URL: https://github.com/oddurs/subway-seat
;; Version: 0.3.0
;; Package-Requires: ((emacs "27.1"))
;; SPDX-License-Identifier: MIT
;; This file is not part of GNU Emacs.
;;; Commentary:
;; Under the quarries: the same green with the lights turned down.
;; The palette and faces live in subway-seat-theme.el; this file lets
;; `load-theme' find `paris-catacombes'.
;;
;; Subway Seat — generated from palette.py by build.py. Edit the palette, not this file.
;;; Code:
(require 'subway-seat-theme)
(deftheme paris-catacombes
"Paris Catacombes: Under the quarries: the same green with the lights turned down.")
;; `load-theme' clears a theme's settings before loading its file, so record them again.
(subway-seat-theme-apply 'paris-catacombes)
(provide-theme 'paris-catacombes)
;;; paris-catacombes-theme.el ends hereparis-carrelage-theme.elsave as ~/.config/emacs/themes/paris-carrelage-theme.elneeds subway-seat-theme.el in the same folder
;;; paris-carrelage-theme.el --- Paris Carrelage, the Carrelage flavor -*- lexical-binding: t; -*-
;; Copyright (C) 2026 Oddur Sigurdsson
;; Author: Oddur Sigurdsson
;; URL: https://github.com/oddurs/subway-seat
;; Version: 0.3.0
;; Package-Requires: ((emacs "27.1"))
;; SPDX-License-Identifier: MIT
;; This file is not part of GNU Emacs.
;;; Commentary:
;; Bevelled white tile under a vaulted platform. The light one.
;; The palette and faces live in subway-seat-theme.el; this file lets
;; `load-theme' find `paris-carrelage'.
;;
;; Subway Seat — generated from palette.py by build.py. Edit the palette, not this file.
;;; Code:
(require 'subway-seat-theme)
(deftheme paris-carrelage
"Paris Carrelage: Bevelled white tile under a vaulted platform. The light one.")
;; `load-theme' clears a theme's settings before loading its file, so record them again.
(subway-seat-theme-apply 'paris-carrelage)
(provide-theme 'paris-carrelage)
;;; paris-carrelage-theme.el ends here