{"id":801,"date":"2026-08-01T14:56:12","date_gmt":"2026-08-01T14:56:12","guid":{"rendered":"https:\/\/jackharvest.com\/?p=801"},"modified":"2026-09-13T23:04:01","modified_gmt":"2026-09-13T23:04:01","slug":"flipflex-plex-client-tcl-flip-phone","status":"publish","type":"post","link":"https:\/\/jackharvest.com\/index.php\/2026\/08\/01\/flipflex-plex-client-tcl-flip-phone\/","title":{"rendered":"FlipFlex \u2013 Plex on a TCL Flip Phone (240\u00d7320, No Touchscreen, Twelve Keys)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>Plex. On a flip phone.<\/strong> 240\u00d7320. No touchscreen. Twelve number keys, a D-pad and two soft keys.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-3 wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"240\" height=\"320\" data-id=\"731\" src=\"https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-splash.png\" alt=\"FlipFlex splash screen on the TCL 4058G\" class=\"wp-image-731\" srcset=\"https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-splash.png 240w, https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-splash-225x300.png 225w\" sizes=\"auto, (max-width: 240px) 100vw, 240px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"240\" height=\"320\" data-id=\"723\" src=\"https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-home.png\" alt=\"FlipFlex home screen with Continue Watching and libraries\" class=\"wp-image-723\" srcset=\"https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-home.png 240w, https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-home-225x300.png 225w\" sizes=\"auto, (max-width: 240px) 100vw, 240px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"240\" height=\"320\" data-id=\"721\" src=\"https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-episode.png\" alt=\"FlipFlex episode details page\" class=\"wp-image-721\" srcset=\"https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-episode.png 240w, https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-episode-225x300.png 225w\" sizes=\"auto, (max-width: 240px) 100vw, 240px\" \/><\/figure>\n<\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The TCL 4058G is the cheap clamshell you buy when you want a phone that is only a phone: a 2.4-inch screen, 916 MB of RAM, a 32-bit MediaTek chip from 2016, and a keypad. It isn\u2019t supposed to run apps at all \u2014 TCL patched the package manager so it refuses to install any.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">FlipFlex is a Plex client for it. It signs in with <code>plex.tv\/link<\/code>, finds your server, browses your libraries, asks the server to transcode down to 320\u00d7240, plays the result on the hardware decoder, reports your position back so the resume point follows you to the TV, and downloads episodes so they play with both radios switched off. It works \u2014 not as a demo. It\u2019s what one of these phones does on a train now.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"320\" height=\"240\" src=\"https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-player.gif\" alt=\"FlipFlex seeking forward fifteen seconds at a time on a live transcode\" class=\"wp-image-727\"\/><figcaption class=\"wp-element-caption\">Six presses of \u2192, fifteen seconds each, on a transcode coming off the server live. Yes, that\u2019s the actual screen.<\/figcaption><\/figure>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/github.com\/jackharvest\/FlipFlex\/releases\/latest\">Download the APK<\/a><\/div>\n\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/github.com\/jackharvest\/FlipFlex\">View on GitHub<\/a><\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Read this first: your phone has to be modded<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">FlipFlex cannot be installed on a stock 4058G \u2014 not \u201cis awkward to,\u201d <em>cannot<\/em>. The install block can\u2019t be lifted without root, and the error it throws even lies about why (<code>INSUFFICIENT_STORAGE<\/code>, with 11 GB free). I wrote the unlock up separately, with every silent failure that cost a day: <a href=\"https:\/\/jackharvest.com\/index.php\/2026\/08\/01\/unlock-root-tcl-4058g-flip-phone-macos\/\">Unlocking and rooting the TCL 4058G from a Mac<\/a>. Do that first, then come back.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">After that, install is one <code>adb install<\/code> \u2014 and then <strong>the phone updates itself<\/strong>. Settings \u2192 Help \u2192 Check for updates reads the GitHub releases page, downloads the new APK and installs it on the handset. No cable, no computer.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">It teaches you the keypad, once<\/h2>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-2 wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"240\" height=\"320\" data-id=\"732\" src=\"https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-tour.gif\" alt=\"FlipFlex keypad tour lighting up one control at a time on a drawn handset\" class=\"wp-image-732\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"240\" height=\"320\" data-id=\"724\" src=\"https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-link-pin.png\" alt=\"FlipFlex showing a four-character plex.tv\/link code\" class=\"wp-image-724\" srcset=\"https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-link-pin.png 240w, https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-link-pin-225x300.png 225w\" sizes=\"auto, (max-width: 240px) 100vw, 240px\" \/><\/figure>\n<\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">None of this is guessable. Neither soft key is Back. The green call key is Search. Two keys on the top row quit the app and open the stock mail client. So first launch draws the handset and lights one control at a time \u2014 twelve steps, before anything else. The phone in that tour is drawn on a canvas rather than a photo, so the keypad gets the space and a key can light up. Signing in is then just four characters typed into plex.tv\/link on something with a real keyboard.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Browsing<\/h2>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-3 wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"240\" height=\"320\" data-id=\"729\" src=\"https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-recommended.png\" alt=\"FlipFlex library Recommended tab\" class=\"wp-image-729\" srcset=\"https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-recommended.png 240w, https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-recommended-225x300.png 225w\" sizes=\"auto, (max-width: 240px) 100vw, 240px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"240\" height=\"320\" data-id=\"717\" src=\"https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-az.png\" alt=\"FlipFlex A\u2013Z library with jump rail\" class=\"wp-image-717\" srcset=\"https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-az.png 240w, https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-az-225x300.png 225w\" sizes=\"auto, (max-width: 240px) 100vw, 240px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"240\" height=\"320\" data-id=\"718\" src=\"https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-categories.png\" alt=\"FlipFlex genre categories\" class=\"wp-image-718\" srcset=\"https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-categories.png 240w, https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-categories-225x300.png 225w\" sizes=\"auto, (max-width: 240px) 100vw, 240px\" \/><\/figure>\n<\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Every library has three views \u2014 <strong>Recommended<\/strong>, <strong>Library<\/strong> and <strong>Categories<\/strong> \u2014 reachable by pressing <code>1<\/code>, <code>2<\/code> or <code>3<\/code>, which matters when you\u2019re 400 titles deep in an A\u2013Z of 574 shows. The A\u2013Z rail down the right edge is a jump list, and Continue Watching sits at the top of the home screen, because on a phone that gets opened for four minutes at a time, the shortest path from lid-open to playing is the whole feature.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The details page tells you what\u2019s about to happen<\/h2>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-3 wp-block-gallery-4 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"240\" height=\"320\" data-id=\"719\" src=\"https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-details.png\" alt=\"FlipFlex details page comparing the source file with what will be played\" class=\"wp-image-719\" srcset=\"https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-details.png 240w, https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-details-225x300.png 225w\" sizes=\"auto, (max-width: 240px) 100vw, 240px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"240\" height=\"320\" data-id=\"728\" src=\"https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-quality.png\" alt=\"FlipFlex quality picker\" class=\"wp-image-728\" srcset=\"https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-quality.png 240w, https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-quality-225x300.png 225w\" sizes=\"auto, (max-width: 240px) 100vw, 240px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"240\" height=\"320\" data-id=\"720\" src=\"https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-download-progress.png\" alt=\"FlipFlex download in progress\" class=\"wp-image-720\" srcset=\"https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-download-progress.png 240w, https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-download-progress-225x300.png 225w\" sizes=\"auto, (max-width: 240px) 100vw, 240px\" \/><\/figure>\n<\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Two columns and an arrow: what the file <strong>is<\/strong> (<code>1080p \u00b7 H264 \u00b7 4.9 Mbps \u00b7 AAC 5.1<\/code>) and what will actually reach the screen (<code>320\u00d7240 \u00b7 800 kbps \u00b7 AAC Stereo<\/code>). The colors mean the same thing everywhere in the app \u2014 blue is the file, green is what gets decoded here, violet is storage on the phone, rose is subtitles. Subtitles are burned in, because ExoPlayer can\u2019t draw the picture subtitles a Blu-ray rip carries.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Playing<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"240\" height=\"180\" src=\"https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-play.gif\" alt=\"FlipFlex playing video in landscape on the flip phone\" class=\"wp-image-726\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The player is landscape \u2014 worth 1.8\u00d7 the picture on a 320\u00d7240 panel \u2014 and specifically <em>reverse<\/em> landscape by default, for a reason no spec sheet contains: the normal way up puts the power button and headphone jack along the bottom, so a phone with anything plugged in can\u2019t stand on a table. Closing the lid pauses and posts your position to Plex. Opening it again deliberately does <em>not<\/em> resume, because a media app that starts making noise when you open your phone in a meeting is a liability.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Search is the green key<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"240\" height=\"320\" src=\"https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-search.gif\" alt=\"FlipFlex search using the green call key\" class=\"wp-image-730\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The call button is the one genuinely spare hardware key on the phone, and FlipFlex catches it before the dialer can, from every screen except the player.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Downloads, and then airplane mode<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pick Download on any episode and it\u2019s fetched by a foreground service that survives the lid being shut. Downloads default to Wi-Fi only and start themselves when Wi-Fi comes back. Then turn everything off: cold-start the app with no signal and you get your downloads library, your login intact, and files that play off local storage on the hardware decoder.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Things that turned out to be interesting<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Downloaded files couldn\u2019t be seeked, and Plex wouldn\u2019t fix it.<\/strong> The file is muxed live, so it arrives with no Cues element \u2014 the only thing ExoPlayer builds a seek map from. So FlipFlex writes the index itself: one linear walk, a cue point every five seconds, spliced in ahead of the first cluster.<\/li>\n\n<li><strong>Plex\u2019s built-in Android profile can\u2019t ask for a single file.<\/strong> The same request as <code>Chrome<\/code> returns 49 MB of Matroska. So streaming stays honest as Android, and downloads claim to be Chrome.<\/li>\n\n<li><strong>A paused transcode gets reaped, and the failure arrives minutes later<\/strong> \u2014 playback resumes perfectly off the leftover segments, then dies on the first one that was never written.<\/li>\n\n<li><strong><code>optString<\/code> can\u2019t be used on Plex JSON.<\/strong> For an explicit <code>null<\/code> it returns the four-character string <code>\"null\"<\/code> \u2014 which got stored as the account token.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Putting it in the phone\u2019s own Menu<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignright size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"240\" height=\"320\" src=\"https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-phone-menu.png\" alt=\"FlipFlex listed as item 10 in the TCL flip phone\u2019s own Menu\" class=\"wp-image-725\" style=\"width:240px\" srcset=\"https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-phone-menu.png 240w, https:\/\/jackharvest.com\/wp-content\/uploads\/2026\/09\/flipflex-phone-menu-225x300.png 225w\" sizes=\"auto, (max-width: 240px) 100vw, 240px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">A sideloaded app doesn\u2019t appear in the 4058G\u2019s Menu no matter how correct its manifest is \u2014 TCL\u2019s launcher walks a hardcoded list of package names. An optional Magisk overlay adds one entry to that list, which is what puts FlipFlex at item 10, next to Settings and Tools, so the phone treats it like something that came with it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">FlipFlex is a sibling of <a href=\"https:\/\/jackharvest.com\/index.php\/2026\/08\/12\/pocketflex-plex-client-miyoo-mini-plus-onionos\/\">PocketFlex<\/a> (the same job on a Miyoo Mini Plus) and has a Jellyfin twin, <a href=\"https:\/\/jackharvest.com\/index.php\/2026\/08\/02\/flipfin-jellyfin-client-tcl-flip-phone\/\">FlipFin<\/a>. Credit to <a href=\"https:\/\/github.com\/neutronscott\/flip2\">neutronscott\/flip2<\/a>, Magisk, mtkclient and Media3\/ExoPlayer. Not affiliated with Plex or TCL. MIT licensed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Free and open source, and it\u2019s staying that way. If it saved you some time, you can <a href=\"https:\/\/www.buymeacoffee.com\/jackharvest\">buy me a coffee<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>FlipFlex is a Plex client for the TCL 4058G flip phone: plex.tv\/link sign-in, keypad browsing, hardware-decoded playback, resume points that follow you to the TV, and downloads you can watch with both radios off.<\/p>\n","protected":false},"author":1,"featured_media":835,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_seopress_titles_title":"FlipFlex \u2013 Plex Client for the TCL 4058G Flip Phone","_seopress_titles_desc":"Plex on a flip phone. FlipFlex browses your libraries with the keypad, plays on the hardware decoder, and downloads episodes for offline viewing. Free, MIT licensed.","_seopress_robots_index":"","_seopress_robots_follow":"","_seopress_robots_imageindex":"","_seopress_robots_snippet":"","_seopress_robots_primary_cat":"","_seopress_robots_breadcrumbs":"","_seopress_robots_freeze_modified_date":"","_seopress_robots_custom_modified_date":"","_seopress_robots_canonical":"","_seopress_social_fb_title":"","_seopress_social_fb_desc":"","_seopress_social_fb_img":"","_seopress_social_fb_img_attachment_id":0,"_seopress_social_fb_img_width":0,"_seopress_social_fb_img_height":0,"_seopress_social_twitter_title":"","_seopress_social_twitter_desc":"","_seopress_social_twitter_img":"","_seopress_social_twitter_img_attachment_id":0,"_seopress_social_twitter_img_width":0,"_seopress_social_twitter_img_height":0,"_seopress_redirections_value":"","_seopress_redirections_enabled":"","_seopress_redirections_enabled_regex":"","_seopress_redirections_logged_status":"","_seopress_redirections_param":"","_seopress_redirections_type":0,"_seopress_analysis_target_kw":"Plex flip phone,Plex TCL flip,TCL 4058G apps,Plex dumbphone,Plex keypad app,TCL Flip 2 Plex","neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"categories":[106,99,77],"tags":[111,110,114,108,112,115,105,88,100,109],"class_list":["post-801","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-flip-phones","category-media-servers","category-projects","tag-android","tag-dumbphone","tag-exoplayer","tag-flip-phone","tag-kotlin","tag-media3","tag-offline-downloads","tag-open-source","tag-plex","tag-tcl-4058g"],"_links":{"self":[{"href":"https:\/\/jackharvest.com\/index.php\/wp-json\/wp\/v2\/posts\/801","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jackharvest.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jackharvest.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jackharvest.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jackharvest.com\/index.php\/wp-json\/wp\/v2\/comments?post=801"}],"version-history":[{"count":2,"href":"https:\/\/jackharvest.com\/index.php\/wp-json\/wp\/v2\/posts\/801\/revisions"}],"predecessor-version":[{"id":825,"href":"https:\/\/jackharvest.com\/index.php\/wp-json\/wp\/v2\/posts\/801\/revisions\/825"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jackharvest.com\/index.php\/wp-json\/wp\/v2\/media\/835"}],"wp:attachment":[{"href":"https:\/\/jackharvest.com\/index.php\/wp-json\/wp\/v2\/media?parent=801"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jackharvest.com\/index.php\/wp-json\/wp\/v2\/categories?post=801"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jackharvest.com\/index.php\/wp-json\/wp\/v2\/tags?post=801"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}