Skip to content

Instantly share code, notes, and snippets.

@sdshan8
Last active January 29, 2026 14:33
Show Gist options
  • Select an option

  • Save sdshan8/5dfcc9efbd2017d2d6feefd752f057ed to your computer and use it in GitHub Desktop.

Select an option

Save sdshan8/5dfcc9efbd2017d2d6feefd752f057ed to your computer and use it in GitHub Desktop.

Install Jellyfin on Termux [In Proot]

This guide shows two methods of installing Jellyfin on termux

Note: only tested on aarch64/arm64

Note: I am not updating it anymore as you can install Jellyfin directly in termux now, just install jellyfin-server package in termux, tho you might have issues the jellyfin's ffmpeg if so then use jellyfin --ffmpeg $(which ffmpeg) to run jellyfin instead

These steps are same for both methods:

  1. Update the repo
pkg update
  1. Install proot-distro and ffmpeg (ffmpeg is only required in Method 2)
pkg install proot-distro ffmpeg -y
  1. Install ubuntu and Login to it
proot-distro install ubuntu
proot-distro login ubuntu
  1. Update and upgrade the packages in ubuntu
apt update && apt upgrade -y
  1. .NET 7.0 workaround:
  • Use nano (or editor of your choice) to make a file in /etc/profile.d
nano /etc/profile.d/02-dotnet-fix.sh
  • Paste the following to set the value of DOTNET_GCHeapHardLimit to 1C0000000 (You might need to lower the value to get it to work):
export DOTNET_GCHeapHardLimit=1C0000000
  • Save and exit nano by pressing CTRL + x then y then enter
  • Make it executable
chmod +x /etc/profile.d/02-dotnet-fix.sh
  • Logout and log back into proot

Method 1:

  1. Install sudo curl and gnupg
apt install sudo curl gnupg -y
  1. Follow the step 2 to 6 in the official ubuntu installation guide for Jellyfin here

  2. Create a symbolic link for Jellyfin web client (as it's in the wrong folder)

ln -s /usr/share/jellyfin/web /usr/lib/jellyfin/bin/jellyfin-web
  1. Run Jellyfin
jellyfin
  • Note: if you get network related errors add --nonetchange parameter to jellyfin
  1. Give it a few minutes to finish startup then goto http://localhost:8096 to setup Jellyfin

Method 2:

  1. Install necessary packages (skip wget if you have it installed in termux, also replace 74 with the latest version of libicu)
apt install wget libicu74 libfontconfig1 ca-certificates -y
  1. Make a new folder in /opt by the name jellyfin and cd into it
mkdir /opt/jellyfin
cd /opt/jellyfin
  1. Download the latest generic linux build for your architecture from here with wget (make sure you download the correct architecture for you device)
wget https://repo.jellyfin.org/files/server/linux/latest-stable/arm64/jellyfin_10.10.6-arm64.tar.gz
  1. Extract it with tar
tar xvzf jellyfin_10.10.6-arm64.tar.gz
  1. Create four sub-directories for Jellyfin data
mkdir data cache config log
  1. Use nano to make a script to run Jellyfin
nano jellyfin.sh
  • Paste the following:
#!/bin/bash
JELLYFINDIR="/opt/jellyfin"

$JELLYFINDIR/jellyfin/jellyfin \
 -d $JELLYFINDIR/data \
 -C $JELLYFINDIR/cache \
 -c $JELLYFINDIR/config \
 -l $JELLYFINDIR/log \
 --ffmpeg /data/data/com.termux/files/usr/bin/ffmpeg
  • Note: if you get network related errors add --nonetchange parameter to jellyfin in the jellyfin.sh
  • Save and exit nano by pressing CTRL + x then y then enter
  1. Make it executable
chmod +x jellyfin.sh
  1. Run it
/opt/jellyfin/jellyfin.sh
  1. Give it a few minutes to finish startup then goto http://localhost:8096 to setup Jellyfin

Thanks to @vikoadi and @t-e-s-tweb for DOTNET_GCHeapHardLimit=1C0000000 and --nonetchange fix

#!/bin/bash
JELLYFINDIR="/opt/jellyfin"
$JELLYFINDIR/jellyfin/jellyfin \
-d $JELLYFINDIR/data \
-C $JELLYFINDIR/cache \
-c $JELLYFINDIR/config \
-l $JELLYFINDIR/log \
--ffmpeg /data/data/com.termux/files/usr/bin/ffmpeg
@vikoadi
Copy link

vikoadi commented Jan 1, 2025

moved to this path : https://repo.jellyfin.org/files/server/linux/latest-stable/arm64/jellyfin_10.9.8-arm64.tar.gz

i get this error when i run that version

root@localhost:/opt/jellyfin-10# sh /opt/jellyfin-10/jellyfin.sh
GC heap initialization failed with error 0x8007000E
Failed to create CoreCLR, HRESULT: 0x8007000E
root@localhost:/opt/jellyfin-10#

I can run jellyfin-10.10.3 by exporting environment variable
DOTNET_GCHeapHardLimit=1C0000000
dotnet/runtime#79612 (comment)

@aicynide
Copy link

aicynide commented Feb 3, 2025

@sdshan8 can you help packaging jellyfin officially for termux?
termux/termux-packages#23074

@metisro
Copy link

metisro commented Feb 17, 2025

I have tried both methods with the latest jellyfin-10.10.6 on Xiaomi Mi A1 with Lineage OS 20, (Android 13) and I have always the same error:

root@localhost:/opt/jellyfin# /opt/jellyfin/jellyfin.sh
GC heap initialization failed with error 0x8007000E
Failed to create CoreCLR, HRESULT: 0x8007000E

I have tried also exporting the environment variable DOTNET_GCHeapHardLimit=1C0000000

I mention that I had exactly the same error also with Ubuntu on UserLand.
If anybody has a suggestion I would gladly try it

@sdshan8
Copy link
Author

sdshan8 commented Feb 17, 2025

I have tried both methods with the latest jellyfin-10.10.6 on Xiaomi Mi A1 with Lineage OS 20, (Android 13) and I have always the same error:

root@localhost:/opt/jellyfin# /opt/jellyfin/jellyfin.sh
GC heap initialization failed with error 0x8007000E
Failed to create CoreCLR, HRESULT: 0x8007000E

I have tried also exporting the environment variable DOTNET_GCHeapHardLimit=1C0000000

I mention that I had exactly the same error also with Ubuntu on UserLand. If anybody has a suggestion I would gladly try it

Try lowering the value for DOTNET_GCHeapHardLimit environment variable
(Note: the value is in hexadecimal)

@metisro
Copy link

metisro commented Feb 17, 2025

@sdshan8 Thank you that worked with export DOTNET_GCHeapHardLimit=80000000 // 2 GB
but now I have another error connected with permission on network interfaces

[20:05:02] [INF] [1] Emby.Server.Implementations.AppBase.BaseConfigurationManager: Setting cache path: /opt/jellyfin/cache
[20:05:02] [INF] [1] Emby.Server.Implementations.ApplicationHost: Loading assemblies
[20:05:02] [ERR] [1] Jellyfin.Networking.Manager.NetworkManager: Error obtaining interfaces.
System.Net.NetworkInformation.NetworkInformationException (13): Permission denied
   at System.Net.NetworkInformation.LinuxNetworkInterface.GetLinuxNetworkInterfaces()
   at Jellyfin.Networking.Manager.NetworkManager.InitializeInterfaces()
[20:05:02] [WRN] [1] Jellyfin.Networking.Manager.NetworkManager: No interface information available. Using loopback interface(s).

@sdshan8
Copy link
Author

sdshan8 commented Feb 17, 2025

@sdshan8 Thank you that worked with export DOTNET_GCHeapHardLimit=80000000 // 2 GB but now I have another error connected with permission on network interfaces

[20:05:02] [INF] [1] Emby.Server.Implementations.AppBase.BaseConfigurationManager: Setting cache path: /opt/jellyfin/cache
[20:05:02] [INF] [1] Emby.Server.Implementations.ApplicationHost: Loading assemblies
[20:05:02] [ERR] [1] Jellyfin.Networking.Manager.NetworkManager: Error obtaining interfaces.
System.Net.NetworkInformation.NetworkInformationException (13): Permission denied
   at System.Net.NetworkInformation.LinuxNetworkInterface.GetLinuxNetworkInterfaces()
   at Jellyfin.Networking.Manager.NetworkManager.InitializeInterfaces()
[20:05:02] [WRN] [1] Jellyfin.Networking.Manager.NetworkManager: No interface information available. Using loopback interface(s).

sadly I don't have an android 13 device to test it, and I unable to recreate it on Android 12.

but this error shouldn't stop jellyfin from listening on localhost,

also if you get a skia related error, just install libfontconfig1

@t-e-s-tweb
Copy link

@sdshan8 Thank you that worked with export DOTNET_GCHeapHardLimit=80000000 // 2 GB but now I have another error connected with permission on network interfaces

[20:05:02] [INF] [1] Emby.Server.Implementations.AppBase.BaseConfigurationManager: Setting cache path: /opt/jellyfin/cache
[20:05:02] [INF] [1] Emby.Server.Implementations.ApplicationHost: Loading assemblies
[20:05:02] [ERR] [1] Jellyfin.Networking.Manager.NetworkManager: Error obtaining interfaces.
System.Net.NetworkInformation.NetworkInformationException (13): Permission denied
   at System.Net.NetworkInformation.LinuxNetworkInterface.GetLinuxNetworkInterfaces()
   at Jellyfin.Networking.Manager.NetworkManager.InitializeInterfaces()
[20:05:02] [WRN] [1] Jellyfin.Networking.Manager.NetworkManager: No interface information available. Using loopback interface(s).

sadly I don't have an android 13 device to test it, and I unable to recreate it on Android 12.

but this error shouldn't stop jellyfin from listening on localhost,

also if you get a skia related error, just install libfontconfig1

Just add parameter --nonetchange to the inside jellyfin.sh executable. Error should to away. It still listens on local host and works. Running on android 14 Debian with 2gb limit dotnet.

@metisro
Copy link

metisro commented Feb 18, 2025

@t-e-s-tweb Adding the --nonetchange parameter did the trick, Thank you very much to all for all the help :)

@t-e-s-tweb
Copy link

Now does anyone know how to add -hwaccel mediacodec option to jellyfin. This isnt using this flag in ffmpeg which is required for hardware decoding encoding. The server is transcoding using software encoder which is 2x to 3x but used too much battery.

@sdshan8
Copy link
Author

sdshan8 commented Feb 18, 2025

Now does anyone know how to add -hwaccel mediacodec option to jellyfin. This isnt using this flag in ffmpeg which is required for hardware decoding encoding. The server is transcoding using software encoder which is 2x to 3x but used too much battery.

I don't think that's supported by jellyfin and even if it was supported i don't think it will work as ffmpeg can't access android's system libraries

@sdshan8
Copy link
Author

sdshan8 commented Feb 18, 2025

Now does anyone know how to add -hwaccel mediacodec option to jellyfin. This isnt using this flag in ffmpeg which is required for hardware decoding encoding. The server is transcoding using software encoder which is 2x to 3x but used too much battery.

you can try using rffmpeg but I can't help with that as I haven't checked it out

@sdshan8
Copy link
Author

sdshan8 commented Feb 18, 2025

@sdshan8 Thank you that worked with export DOTNET_GCHeapHardLimit=80000000 // 2 GB but now I have another error connected with permission on network interfaces

[20:05:02] [INF] [1] Emby.Server.Implementations.AppBase.BaseConfigurationManager: Setting cache path: /opt/jellyfin/cache
[20:05:02] [INF] [1] Emby.Server.Implementations.ApplicationHost: Loading assemblies
[20:05:02] [ERR] [1] Jellyfin.Networking.Manager.NetworkManager: Error obtaining interfaces.
System.Net.NetworkInformation.NetworkInformationException (13): Permission denied
   at System.Net.NetworkInformation.LinuxNetworkInterface.GetLinuxNetworkInterfaces()
   at Jellyfin.Networking.Manager.NetworkManager.InitializeInterfaces()
[20:05:02] [WRN] [1] Jellyfin.Networking.Manager.NetworkManager: No interface information available. Using loopback interface(s).

sadly I don't have an android 13 device to test it, and I unable to recreate it on Android 12.
but this error shouldn't stop jellyfin from listening on localhost,
also if you get a skia related error, just install libfontconfig1

Just add parameter --nonetchange to the inside jellyfin.sh executable. Error should to away. It still listens on local host and works. Running on android 14 Debian with 2gb limit dotnet.

Thank you, I will add it to the gist for other peoples

@tribhuwan-kumar
Copy link

this isn't working on android 15 lineageos, sadly you just can't access the network interface from proot distro.

@EduardoV-V
Copy link

this isn't working on android 15 lineageos, sadly you just can't access the network interface from proot distro.

hey, idk if you are still with that problem, but i managed to run it on lineageos 22, android 15 now. I just had to edit the export DOTNET_GCHeapHardLimit=1C0000000 to export DOTNET_GCHeapHardLimit=40000000, which limits .NET to 1gb, since my phone doesnt have as much as the default configurations sets it. Also, i added the --nonetchange param to the jellyfin.sh file. The server is running fine on localhost, i just havent tested exposing it to external networks.

@tribhuwan-kumar
Copy link

this isn't working on android 15 lineageos, sadly you just can't access the network interface from proot distro.

hey, idk if you are still with that problem, but i managed to run it on lineageos 22, android 15 now. I just had to edit the export DOTNET_GCHeapHardLimit=1C0000000 to export DOTNET_GCHeapHardLimit=40000000, which limits .NET to 1gb, since my phone doesnt have as much as the default configurations sets it. Also, i added the --nonetchange param to the jellyfin.sh file. The server is running fine on localhost, i just havent tested exposing it to external networks.

thanks but i solve the issue just by installing the postmarketos in my redmi k20

@Valienteuh
Copy link

I successfully run JellyFin on Android 14 using Termux Today [1-11-2026]. I hustled alot with chatgpt and tried various commands. I asked ChatGpt to compile the correct commands and ways. Asked him to make a Step-by-step guide for Beginners. Here's the link for that
⬇️⬇️⬇️
https://chatgpt.com/s/t_6963820a51a88191866b710285e8bf23

Mentioning some people who commented because it will probably help them idk
@tribhuwan-kumar @cangjingren @vikoadi [sorry if it didn't help you and just wasted time]

@Valienteuh
Copy link

If this guide didn't work for you, Try this :
https://gist.github.com/Valienteuh/2ad0fe58c3c9ecad50425b19478ab61d

@EduardoV-V
Copy link

Has someone else managed to activate hardware acceleration on this same setup? my phone can't transcode in real time sometimes so i tried setting up hardware accelleration, but cant make it work properly.

@Valienteuh
Copy link

no infortunately... in proot-distro, we can use ffmpeg only i think... idk
Transcoding really sucks man!!! even if i turn it off... it still does.

@EduardoV-V
Copy link

no infortunately... in proot-distro, we can use ffmpeg only i think... idk Transcoding really sucks man!!! even if i turn it off... it still does.

the only solution i found was reencoding all my videos to h264 for video and AAC for audio, but try reencoding 500gb of videos without losing your mind lmao

@t-e-s-tweb
Copy link

no infortunately... in proot-distro, we can use ffmpeg only i think... idk Transcoding really sucks man!!! even if i turn it off... it still does.

I havnt tried it but there are guides on Reddit r/termux to get hardware acceleration working on termux. Someone with time should check out that and see if they can get HW acceleration working under those on jellyfin and report back.

People are running whole 3d games on there.

@sdshan8
Copy link
Author

sdshan8 commented Jan 29, 2026

you can probably get hardware acceleration to work but you will have to build your own jellyfin server package (for termux) which has mediacodec as an option for hardware acceleration and use the ffmpeg in termux repo with it

@sdshan8
Copy link
Author

sdshan8 commented Jan 29, 2026

Also there isn't a need to follow this tutorial as there is a jellyfin package in termux repo

@t-e-s-tweb
Copy link

**You guys do know that you can get working Jellyfin just by running these 3 commands right? Its supported out of box now. **

  1. pkg update
  2. pkg install jellyfin-server dotnet9.0
  3. Jellyfin

Full native at max speed.

@t-e-s-tweb
Copy link

you can probably get hardware acceleration to work but you will have to build your own jellyfin server package (for termux) which has mediacodec as an option for hardware acceleration and use the ffmpeg in termux repo with it

Wouldn't this command give HW acceleration?

jellyfin --ffmpeg $(which ffmpeg)

@sdshan8
Copy link
Author

sdshan8 commented Jan 29, 2026

Wouldn't this command give HW acceleration?

jellyfin --ffmpeg $(which ffmpeg)

looking at the ffmpeg transcode logs it doesn't look like it is as it's using the libx264 encoder (software encoder) for transcoding instead of h264_mediacodec (android's hardware encoders)

@t-e-s-tweb
Copy link

Wouldn't this command give HW acceleration?
jellyfin --ffmpeg $(which ffmpeg)

looking at the ffmpeg transcode logs it doesn't look like it is as it's using the libx264 encoder (software encoder) for transcoding instead of h264_mediacodec (android's hardware encoders)

Well since you are a lot move knowledgable in this can you give a pr for termux packages to use mediacodec since that is supported on every android. I don't know why they didn't make it default and choose to stay with libx264.

@EduardoV-V
Copy link

**You guys do know that you can get working Jellyfin just by running these 3 commands right? Its supported out of box now. **

1. pkg update

2. pkg install jellyfin-server dotnet9.0

3. Jellyfin

Full native at max speed.

how did you configure that? mine still asks for dotnet, even after installing it via pkg or apt

@sdshan8
Copy link
Author

sdshan8 commented Jan 29, 2026

Well since you are a lot move knowledgable in this can you give a pr for termux packages to use mediacodec since that is supported on every android. I don't know why they didn't make it default and choose to stay with libx264.

it's not that they choose to stay with libx264, it's just that jellyfin doesn't have the option to use mediacodec, and adding the support in the termux package would be really hard let's just say. it has to be added to the jellyfin first

and i can't really do that as I don't knew much about c# (the langugue jellyfin server is written in)

@sdshan8
Copy link
Author

sdshan8 commented Jan 29, 2026

**You guys do know that you can get working Jellyfin just by running these 3 commands right? Its supported out of box now. **

1. pkg update

2. pkg install jellyfin-server dotnet9.0

3. Jellyfin

Full native at max speed.

how did you configure that? mine still asks for dotnet, even after installing it via pkg or apt

close termux and launch it again

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment