diff --git a/Cargo.lock b/Cargo.lock
index 4c6b9c39..d93c8c7c 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -266,6 +266,7 @@ dependencies = [
  "once_cell",
  "regex",
  "ropey",
+ "rust-embed",
  "serde",
  "smallvec",
  "tendril",
@@ -692,6 +693,39 @@ dependencies = [
  "smallvec",
 ]
 
+[[package]]
+name = "rust-embed"
+version = "5.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2fe1fe6aac5d6bb9e1ffd81002340363272a7648234ec7bdfac5ee202cb65523"
+dependencies = [
+ "rust-embed-impl",
+ "rust-embed-utils",
+ "walkdir",
+]
+
+[[package]]
+name = "rust-embed-impl"
+version = "5.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ed91c41c42ef7bf687384439c312e75e0da9c149b0390889b94de3c7d9d9e66"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "rust-embed-utils",
+ "syn",
+ "walkdir",
+]
+
+[[package]]
+name = "rust-embed-utils"
+version = "5.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a512219132473ab0a77b52077059f1c47ce4af7fbdc94503e9862a34422876d"
+dependencies = [
+ "walkdir",
+]
+
 [[package]]
 name = "ryu"
 version = "1.0.5"
diff --git a/README.md b/README.md
index 31401a24..a90059ca 100644
--- a/README.md
+++ b/README.md
@@ -45,6 +45,13 @@ the `HELIX_RUNTIME` environment variable.
 > NOTE: You should set this to <path to repository>/runtime in development (if
 > running via cargo).
 
+If you want to bake the `runtime/` directory into the Helix binary you can build
+it with:
+
+```
+cargo install --path helix-term --features "embed_runtime"
+```
+
 ## Arch Linux
 There are two packages available from AUR:
  - `helix-bin`: contains prebuilt binary from GitHub releases
diff --git a/book/src/install.md b/book/src/install.md
index 4e3cfc3f..8cbff1a5 100644
--- a/book/src/install.md
+++ b/book/src/install.md
@@ -35,3 +35,10 @@ This will install the `hx` binary to `$HOME/.cargo/bin`.
 Now copy the `runtime/` directory somewhere. Helix will by default look for the
 runtime inside the same folder as the executable, but that can be overriden via
 the `HELIX_RUNTIME` environment variable.
+
+If you want to bake the `runtime/` directory into the Helix binary you can build
+it with:
+
+```
+cargo install --path helix-term --features "embed_runtime"
+```
diff --git a/helix-core/Cargo.toml b/helix-core/Cargo.toml
index b5f2ef77..35f30ede 100644
--- a/helix-core/Cargo.toml
+++ b/helix-core/Cargo.toml
@@ -7,6 +7,10 @@ license = "MPL-2.0"
 
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
+
+[features]
+embed_runtime = []
+
 [dependencies]
 helix-syntax = { path = "../helix-syntax" }
 
@@ -24,3 +28,4 @@ serde = { version = "1.0", features = ["derive"] }
 toml = "0.5"
 
 etcetera = "0.3"
+rust-embed="5.9.0" 
diff --git a/helix-core/src/lib.rs b/helix-core/src/lib.rs
index 3e00081f..6b93de78 100644
--- a/helix-core/src/lib.rs
+++ b/helix-core/src/lib.rs
@@ -44,6 +44,7 @@ pub(crate) fn find_first_non_whitespace_char(text: RopeSlice, line_num: usize) -
     None
 }
 
+#[cfg(not(embed_runtime))]
 pub fn runtime_dir() -> std::path::PathBuf {
     // runtime env var || dir where binary is located
     std::env::var("HELIX_RUNTIME")
diff --git a/helix-core/src/syntax.rs b/helix-core/src/syntax.rs
index ec95708b..2d1cbccb 100644
--- a/helix-core/src/syntax.rs
+++ b/helix-core/src/syntax.rs
@@ -73,16 +73,37 @@ pub struct IndentQuery {
     pub outdent: HashSet<String>,
 }
 
+#[cfg(not(feature = "embed_runtime"))]
+fn load_runtime_file(language: &str, filename: &str) -> Result<String, std::io::Error> {
+    let root = crate::runtime_dir();
+    let path = root.join("queries").join(language).join(filename);
+    std::fs::read_to_string(&path)
+}
+
+#[cfg(feature = "embed_runtime")]
+use rust_embed::RustEmbed;
+
+#[cfg(feature = "embed_runtime")]
+#[derive(RustEmbed)]
+#[folder = "../runtime/"]
+struct Runtime;
+
+#[cfg(feature = "embed_runtime")]
+fn load_runtime_file(language: &str, filename: &str) -> Result<String, Box<dyn std::error::Error>> {
+    let root = PathBuf::new();
+    let path = root.join("queries").join(language).join(filename);
+
+    let query_bytes = Runtime::get(&path.as_path().display().to_string()).unwrap_or_default();
+    std::str::from_utf8(query_bytes.as_ref())
+        .map(|s| s.to_string())
+        .map_err(|err| err.into())
+}
+
 fn read_query(language: &str, filename: &str) -> String {
     static INHERITS_REGEX: Lazy<Regex> =
         Lazy::new(|| Regex::new(r";+\s*inherits\s*:?\s*([a-z_,()]+)\s*").unwrap());
 
-    let root = crate::runtime_dir();
-    // let root = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
-
-    let path = root.join("queries").join(language).join(filename);
-
-    let query = std::fs::read_to_string(&path).unwrap_or_default();
+    let query = load_runtime_file(language, filename).unwrap_or_default();
 
     // TODO: the collect() is not ideal
     let inherits = INHERITS_REGEX
@@ -146,11 +167,8 @@ impl LanguageConfiguration {
             .get_or_init(|| {
                 let language = get_language_name(self.language_id).to_ascii_lowercase();
 
-                let root = crate::runtime_dir();
-                let path = root.join("queries").join(language).join("indents.toml");
-
-                let toml = std::fs::read(&path).ok()?;
-                toml::from_slice(&toml).ok()
+                let toml = load_runtime_file(&language, "indents.toml").ok()?;
+                toml::from_slice(&toml.as_bytes()).ok()
             })
             .as_ref()
     }
diff --git a/helix-term/Cargo.toml b/helix-term/Cargo.toml
index 59d5b325..3751b5ab 100644
--- a/helix-term/Cargo.toml
+++ b/helix-term/Cargo.toml
@@ -8,6 +8,9 @@ license = "MPL-2.0"
 
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
+[features]
+embed_runtime = ["helix-core/embed_runtime"]
+
 [[bin]]
 name = "hx"
 path = "src/main.rs"