diff --git a/disabled-packages/deno/build.sh b/disabled-packages/deno/build.sh
deleted file mode 100644
index 406c113570db1fc..000000000000000
--- a/disabled-packages/deno/build.sh
+++ /dev/null
@@ -1,61 +0,0 @@
-TERMUX_PKG_HOMEPAGE=https://deno.land/
-TERMUX_PKG_DESCRIPTION="A modern runtime for JavaScript and TypeScript"
-TERMUX_PKG_LICENSE="MIT"
-TERMUX_PKG_MAINTAINER="@termux"
-_COMMIT=1259a3f48c00e95a8bb0964e4dabfa769a20bcde
-_COMMIT_DATE=2022.01.19
-TERMUX_PKG_VERSION=1.17.3p${_COMMIT_DATE//./}
-TERMUX_PKG_REVISION=2
-TERMUX_PKG_SRCURL=git+https://github.com/denoland/deno
-TERMUX_PKG_GIT_BRANCH=main
-TERMUX_PKG_DEPENDS="libffi"
-#TERMUX_PKG_BUILD_DEPENDS="librusty-v8"
-TERMUX_PKG_BUILD_IN_SRC=true
-
-# Due to dependency on librusty-v8.
-TERMUX_PKG_BLACKLISTED_ARCHES="arm, i686, x86_64"
-
-termux_step_post_get_source() {
-	git fetch --unshallow
-	git checkout $_COMMIT
-
-	local version="$(git log -1 --format=%cs | sed 's/-/./g')"
-	if [ "$version" != "$_COMMIT_DATE" ]; then
-		echo -n "ERROR: The specified commit date \"$_COMMIT_DATE\""
-		echo " is different from what is expected to be: \"$version\""
-		return 1
-	fi
-
-	git submodule update --init --recursive
-}
-
-termux_step_pre_configure() {
-	termux_setup_rust
-
-	if [ "$TERMUX_DEBUG_BUILD" = "true" ]; then
-		BUILD_TYPE=debug
-	else
-		BUILD_TYPE=release
-	fi
-}
-
-termux_step_make() {
-	local libdir=target/$CARGO_TARGET_NAME/$BUILD_TYPE/deps
-	mkdir -p $libdir
-	ln -sf $TERMUX_PREFIX/lib/libffi.so $libdir/
-	local libgcc="$($CC -print-libgcc-file-name)"
-	echo "INPUT($libgcc -l:libunwind.a)" > $libdir/libgcc.so
-	local cmd="cargo build --jobs $TERMUX_PKG_MAKE_PROCESSES \
-		--target $CARGO_TARGET_NAME"
-	if [ "$TERMUX_DEBUG_BUILD" = "false" ]; then
-		cmd+=" --release"
-	fi
-	#$cmd || :
-	#ln -sf $TERMUX_PREFIX/lib/librusty_v8.a \
-	#	target/$CARGO_TARGET_NAME/release/gn_out/obj/librusty_v8.a
-	$cmd
-}
-
-termux_step_make_install() {
-	install -Dm700 -t $TERMUX_PREFIX/bin target/${CARGO_TARGET_NAME}/$BUILD_TYPE/deno
-}
diff --git a/disabled-packages/deno/cli-tools-upgrade.rs.patch b/disabled-packages/deno/cli-tools-upgrade.rs.patch
deleted file mode 100644
index 9a0a28c22559f64..000000000000000
--- a/disabled-packages/deno/cli-tools-upgrade.rs.patch
+++ /dev/null
@@ -1,23 +0,0 @@
---- ./cli/tools/upgrade.rs.orig	2022-01-20 19:18:16.459123964 +0530
-+++ ./cli/tools/upgrade.rs	2022-01-20 19:27:18.071118123 +0530
-@@ -22,6 +22,7 @@
- 
- const RELEASE_URL: &str = "https://github.com/denoland/deno/releases";
- 
-+#[cfg(not(target_os = "android"))]
- pub async fn upgrade(upgrade_flags: UpgradeFlags) -> Result<(), AnyError> {
-   let mut client_builder = Client::builder();
- 
-@@ -135,6 +136,12 @@
-   Ok(())
- }
- 
-+#[cfg(target_os = "android")]
-+pub async fn upgrade(upgrade_flags: UpgradeFlags) -> Result<(), AnyError> {
-+  println!("You are currently using Deno packaged by the Termux repo. To upgrade Deno, wait for the packagers to update it. This is done to prevent you from breaking your installation.");
-+  std::process::exit(1);
-+}
-+
- async fn get_latest_release_version(
-   client: &Client,
- ) -> Result<String, AnyError> {
diff --git a/disabled-packages/deno/ext-ffi-Cargo.toml.patch b/disabled-packages/deno/ext-ffi-Cargo.toml.patch
deleted file mode 100644
index 2416aecafa45ef0..000000000000000
--- a/disabled-packages/deno/ext-ffi-Cargo.toml.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/ext/ffi/Cargo.toml
-+++ b/ext/ffi/Cargo.toml
-@@ -16,7 +16,7 @@
- [dependencies]
- deno_core = { version = "0.114.0", path = "../../core" }
- dlopen = "0.1.8"
--libffi = "2.0.0"
-+libffi = { version = "2.0.0", features = ["system"] }
- serde = { version = "1.0.129", features = ["derive"] }
- tokio = { version = "1.10.1", features = ["full"] }
- 
diff --git a/disabled-packages/deno/runtime-ops-signal.rs.patch b/disabled-packages/deno/runtime-ops-signal.rs.patch
deleted file mode 100644
index fc1067939366e8d..000000000000000
--- a/disabled-packages/deno/runtime-ops-signal.rs.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/runtime/ops/signal.rs
-+++ b/runtime/ops/signal.rs
-@@ -97,7 +97,7 @@
-   }
- }
- 
--#[cfg(target_os = "linux")]
-+#[cfg(any(target_os = "linux", target_os = "android"))]
- pub fn signal_str_to_int(s: &str) -> Result<libc::c_int, AnyError> {
-   match s {
-     "SIGHUP" => Ok(1),
diff --git a/disabled-packages/librusty-v8/build.sh b/disabled-packages/librusty-v8/build.sh
deleted file mode 100644
index 092eda86200f0b5..000000000000000
--- a/disabled-packages/librusty-v8/build.sh
+++ /dev/null
@@ -1,45 +0,0 @@
-TERMUX_PKG_HOMEPAGE=https://github.com/denoland/rusty_v8
-TERMUX_PKG_DESCRIPTION="High quality Rust bindings to V8's C++ API"
-TERMUX_PKG_LICENSE="MIT"
-TERMUX_PKG_MAINTAINER="@termux"
-_COMMIT=8b90dfd2f4fcbbaefd2c4d2be220d94a00a3ebba
-TERMUX_PKG_VERSION=2022.02.02
-TERMUX_PKG_SRCURL=git+https://github.com/denoland/rusty_v8
-TERMUX_PKG_GIT_BRANCH=main
-TERMUX_PKG_BUILD_IN_SRC=true
-TERMUX_PKG_NO_STATICSPLIT=true
-TERMUX_PKG_BLACKLISTED_ARCHES="arm, i686, x86_64"
-
-termux_step_post_get_source() {
-	git fetch --unshallow || true
-	git checkout $_COMMIT
-
-	local version="$(git log -1 --format=%cs | sed 's/-/./g')"
-	if [ "$version" != "$TERMUX_PKG_VERSION" ]; then
-		echo -n "ERROR: The specified version \"$TERMUX_PKG_VERSION\""
-		echo " is different from what is expected to be: \"$version\""
-		return 1
-	fi
-
-	git submodule update --init --recursive
-}
-
-termux_step_pre_configure() {
-	export V8_FROM_SOURCE=1
-	export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig
-}
-
-termux_step_make() {
-	termux_setup_rust
-	cargo build --jobs $TERMUX_PKG_MAKE_PROCESSES --target $CARGO_TARGET_NAME --release
-}
-
-termux_step_make_install() {
-	install -Dm600 -t $TERMUX_PREFIX/lib \
-		target/$CARGO_TARGET_NAME/release/gn_out/obj/librusty_v8.a
-}
-
-termux_step_post_make_install() {
-	unset V8_FROM_SOURCE
-	unset PKG_CONFIG_PATH
-}
diff --git a/packages/deno/0001-enable-libffi-system-feature.patch b/packages/deno/0001-enable-libffi-system-feature.patch
new file mode 100644
index 000000000000000..a2eff4ddb72d165
--- /dev/null
+++ b/packages/deno/0001-enable-libffi-system-feature.patch
@@ -0,0 +1,13 @@
+diff --git a/ext/ffi/Cargo.toml b/ext/ffi/Cargo.toml
+index 2f0813a58..fda6e2469 100644
+--- a/ext/ffi/Cargo.toml
++++ b/ext/ffi/Cargo.toml
+@@ -18,7 +18,7 @@ deno_core.workspace = true
+ deno_permissions.workspace = true
+ dlopen2.workspace = true
+ dynasmrt = "1.2.3"
+-libffi = "=3.2.0"
++libffi = { version = "=3.2.0", features = ["system"] }
+ libffi-sys = "=2.3.0"
+ log.workspace = true
+ num-bigint.workspace = true
diff --git a/packages/deno/0002-disable-upgrading-via-cli.patch b/packages/deno/0002-disable-upgrading-via-cli.patch
new file mode 100644
index 000000000000000..fd02cd731bfbc5a
--- /dev/null
+++ b/packages/deno/0002-disable-upgrading-via-cli.patch
@@ -0,0 +1,29 @@
+diff --git a/cli/tools/upgrade.rs b/cli/tools/upgrade.rs
+index cb85859f7..891ebb0e2 100644
+--- a/cli/tools/upgrade.rs
++++ b/cli/tools/upgrade.rs
+@@ -480,6 +480,7 @@ async fn fetch_and_store_latest_version<
+   env.write_check_file(&version_file.serialize());
+ }
+ 
++#[cfg(not(target_os = "android"))]
+ pub async fn upgrade(
+   flags: Arc<Flags>,
+   upgrade_flags: UpgradeFlags,
+@@ -612,6 +613,16 @@ pub async fn upgrade(
+   Ok(())
+ }
+ 
++#[cfg(target_os = "android")]
++pub async fn upgrade(
++  flags: Arc<Flags>,
++  upgrade_flags: UpgradeFlags,
++) -> Result<(), AnyError> {
++  log::error!("You are currently using Deno packaged by the Termux repo. Upgrading Deno via CLI will cause an issue to installed Deno. Wait for an update on Deno package in the Termux repo to upgrade.");
++  deno_runtime::exit(1);
++}
++
++
+ #[derive(Debug, PartialEq)]
+ enum RequestedVersion {
+   Latest(ReleaseChannel),
diff --git a/packages/deno/build.sh b/packages/deno/build.sh
new file mode 100644
index 000000000000000..6b456ea590ebbb1
--- /dev/null
+++ b/packages/deno/build.sh
@@ -0,0 +1,22 @@
+TERMUX_PKG_HOMEPAGE=https://deno.land/
+TERMUX_PKG_DESCRIPTION="A modern runtime for JavaScript and TypeScript"
+TERMUX_PKG_LICENSE="MIT"
+TERMUX_PKG_MAINTAINER="@termux"
+TERMUX_PKG_VERSION=2.1.1
+TERMUX_PKG_SRCURL=git+https://github.com/denoland/deno
+TERMUX_PKG_DEPENDS="glib"
+TERMUX_PKG_BUILD_IN_SRC=true
+
+termux_step_configure() {
+	termux_setup_rust
+	termux_setup_cmake
+	termux_setup_protobuf
+}
+
+termux_step_make() {
+	cargo build -vv --jobs "${TERMUX_PKG_MAKE_PROCESSES}" --target "${CARGO_TARGET_NAME}" --release
+}
+
+termux_step_make_install() {
+	install -Dm700 -t "${TERMUX_PREFIX}/bin" "target/${CARGO_TARGET_NAME}/release/gleam"
+}
diff --git a/packages/librusty-v8/0001-sizeof-in-i686.patch b/packages/librusty-v8/0001-sizeof-in-i686.patch
new file mode 100644
index 000000000000000..53c5e9f73e22e2a
--- /dev/null
+++ b/packages/librusty-v8/0001-sizeof-in-i686.patch
@@ -0,0 +1,28 @@
+--- a/src/binding.cc
++++ b/src/binding.cc
+@@ -54,6 +54,7 @@
+ 
+ static_assert(sizeof(v8::Locker) == sizeof(size_t) * 2, "Locker size mismatch");
+ 
++#if !(defined(__ANDROID__) && defined(__i386__))
+ static_assert(sizeof(v8::ScriptCompiler::CompilationDetails) ==
+                   sizeof(int64_t) * 3,
+               "CompilationDetails size mismatch");
+@@ -66,6 +67,17 @@
+                          align_to<int64_t>(sizeof(size_t)) +
+                          sizeof(v8::ScriptCompiler::CompilationDetails)),
+     "Source size mismatch");
++#else
++static_assert(sizeof(v8::ScriptCompiler::CompilationDetails) ==
++                  sizeof(int64_t) * 2 + sizeof(uint32_t) /* enum class */,
++              "CompilationDetails size mismatch");
++
++static_assert(
++    sizeof(v8::ScriptCompiler::Source) ==
++        align_to<size_t>(sizeof(size_t) * 8 + sizeof(int) * 3 +
++                         sizeof(v8::ScriptCompiler::CompilationDetails)),
++    "Source size mismatch");
++#endif
+ 
+ static_assert(sizeof(v8::FunctionCallbackInfo<v8::Value>) == sizeof(size_t) * 3,
+               "FunctionCallbackInfo size mismatch");
diff --git a/packages/librusty-v8/0002-build-triple.patch b/packages/librusty-v8/0002-build-triple.patch
new file mode 100644
index 000000000000000..13bf253f53aa241
--- /dev/null
+++ b/packages/librusty-v8/0002-build-triple.patch
@@ -0,0 +1,20 @@
+--- a/build.rs
++++ b/build.rs
+@@ -259,11 +259,17 @@
+       "x64"
+     } else if target_arch == "aarch64" {
+       "arm64"
++    } else if target_arch == "arm" {
++      "arm"
++    } else if target_triple.starts_with("i686-") {
++      "x86"
+     } else {
+       "unknown"
+     };
+     if target_arch == "x86_64" {
+       maybe_install_sysroot("amd64");
++    } else if target_triple.starts_with("i686-") {
++      maybe_install_sysroot("i386");
+     }
+     gn_args.push(format!(r#"v8_target_cpu="{}""#, arch).to_string());
+     gn_args.push(format!(r#"target_cpu="{}""#, arch).to_string());
diff --git a/packages/librusty-v8/build.sh b/packages/librusty-v8/build.sh
new file mode 100644
index 000000000000000..a2541c847b540b0
--- /dev/null
+++ b/packages/librusty-v8/build.sh
@@ -0,0 +1,51 @@
+TERMUX_PKG_HOMEPAGE=https://github.com/denoland/rusty_v8
+TERMUX_PKG_DESCRIPTION="High quality Rust bindings to V8's C++ API"
+TERMUX_PKG_LICENSE="MIT"
+TERMUX_PKG_MAINTAINER="@termux"
+TERMUX_PKG_VERSION=130.0.1
+TERMUX_PKG_SRCURL=git+https://github.com/denoland/rusty_v8
+TERMUX_PKG_BUILD_IN_SRC=true
+TERMUX_PKG_NO_STATICSPLIT=true
+
+termux_step_configure() {
+	termux_setup_rust
+	termux_setup_ninja
+	termux_setup_gn
+
+	export EXTRA_GN_ARGS="
+android32_ndk_api_level=$TERMUX_PKG_API_LEVEL
+android64_ndk_api_level=$TERMUX_PKG_API_LEVEL
+android_ndk_root=\"$NDK\"
+android_ndk_version=\"$TERMUX_NDK_VERSION\"
+"
+
+	if [ "$TERMUX_ARCH" = "arm" ]; then
+		EXTRA_GN_ARGS+=" target_cpu = \"arm\""
+		EXTRA_GN_ARGS+=" v8_target_cpu = \"arm\""
+		EXTRA_GN_ARGS+=" arm_arch = \"armv7-a\""
+		EXTRA_GN_ARGS+=" arm_float_abi = \"softfp\""
+	fi
+
+	# shellcheck disable=SC2155 # Ignore command exit-code
+	export GN="$(command -v gn)"
+
+	# Make build.rs happy
+	ln -sf "$NDK" "$TERMUX_PKG_SRCDIR"/third_party/android_ndk
+
+	BINDGEN_EXTRA_CLANG_ARGS="--target=$CCTERMUX_HOST_PLATFORM"
+	BINDGEN_EXTRA_CLANG_ARGS+=" --sysroot=$TERMUX_PKG_SRCDIR/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot"
+	export BINDGEN_EXTRA_CLANG_ARGS
+	local env_name=BINDGEN_EXTRA_CLANG_ARGS_${CARGO_TARGET_NAME@U}
+	env_name=${env_name//-/_}
+	export "$env_name"="$BINDGEN_EXTRA_CLANG_ARGS"
+}
+
+termux_step_make() {
+	export V8_FROM_SOURCE=1
+	cargo build -vv --jobs "${TERMUX_PKG_MAKE_PROCESSES}" --target "${CARGO_TARGET_NAME}" --release
+}
+
+termux_step_make_install() {
+	install -Dm600 -t "${TERMUX_PREFIX}/include/librusty_v8" "target/${CARGO_TARGET_NAME}/release/gn_out/src_binding.rs"
+	install -Dm600 -t "${TERMUX_PREFIX}/lib" "target/${CARGO_TARGET_NAME}/release/gn_out/obj/librusty_v8.a"
+}
diff --git a/scripts/setup-ubuntu.sh b/scripts/setup-ubuntu.sh
index 50fa9a7722a28fd..e89d12fa1ea5e7a 100755
--- a/scripts/setup-ubuntu.sh
+++ b/scripts/setup-ubuntu.sh
@@ -149,6 +149,10 @@ PACKAGES+=" llvm-17-dev"
 PACKAGES+=" llvm-17-tools"
 PACKAGES+=" clang-17"
 
+# Needed by librusty-v8
+PACKAGES+=" libclang-rt-17-dev"
+PACKAGES+=" libclang-rt-17-dev:i386"
+
 # Needed for package smalltalk.
 PACKAGES+=" libsigsegv-dev"
 PACKAGES+=" zip"