Jcorp Nomad: Mini WIFI Media Server

by Jstudner10 in Circuits > Gadgets

1184 Views, 4 Favorites, 0 Comments

Jcorp Nomad: Mini WIFI Media Server

Screenshot 2025-07-08 143247.png
NomadVideoDemogif.gif

Hello Makers!

I'm excited to share my design and code for the Jcorp Nomad Project, a portable offline media server powered by the ESP32-S3.

I'm Jackson, a mechanical engineering student with minimal programming experience, and this project became my hands-on way to learn coding, embedded systems, and web UI design.

Jcorp Nomad is a portable media server you can take anywhere, camping, traveling, or just offline. It runs on an ESP32-S3 and lets you stream your own movies, music, books, and shows over a local Wi-Fi hotspot with no internet required.

Why I Built This

I love camping and road trips, but often hit a wall with unreliable offline entertainment. Streaming apps disappoint and pre-downloaded content isn’t always accessible or flexible.

Nomad solves that by letting you carry your own mini media server. Connect your phone, laptop, or tablet via Wi-Fi to browse and stream content from an SD card. Multiple devices can connect simultaneously, no cellular, no USB cables.

What is Nomad?

Nomad is an ESP32-S3–based project that:

  1. Creates a local Wi-Fi hotspot with no internet needed
  2. Functions similar to media services like Jellyfin but fully offline and more portable.
  3. Serves movies, music, shows, and books via a browser-accessible web UI
  4. Hosts all media from a FAT32-formatted SD card
  5. Lets multiple devices stream different files at the same time (I’ve tested up to 4 video streams reliably)
  6. Uses a touchscreen interface (customizable with SquareLine Studio + LVGL)
  7. Works on most phones, laptops, and Apple devices (some edge cases may need Wi-Fi tweaks, explained below)
  8. Supports basic media controls like play, pause, fast-forward, and file browsing

Supplies

6126iPTIR0L._AC_SL1280_.jpg
Screenshot 2025-07-07 195744.png
Screenshot 2025-07-07 192338.png

What You'll Need

Below is a general list of what you'll need to complete the Jcorp Nomad project. I've also included a few notes on how to swap out components depending on your goals > whether you're looking to save money, go fully portable, or make it uniquely your own.

Note: The links below are Amazon affiliate links. If you click one and end up buying something, I might earn a few cents, just enough to fund more SD cards and maybe, one day, a coffee that isn't instant. Thanks for keeping the project alive (and me caffeinated).

- Waveshare ESP32-S3 with 1.47" Display

Amazon Link (affiliate)

This all-in-one development board powers the entire project, Wi-Fi, display, and SD card support all on a single compact PCB. While there are other ways to build this using separate components, this board is the easiest, cleanest, and most space-efficient method.

A screenless, battery-powered version is also possible (and cheaper), and it's discussed later in the guide if you're interested in a stealthy low-power setup.

- MicroSD Card (16GB or larger)

Amazon Link (affiliate)

I recommend at least 64GB if you want to store a decent media library, but the system will work with as little as 16GB if you're only loading a few files. Just make sure to format it as FAT32, the ESP32 doesn't play nicely with exFAT or NTFS.

If you're feeling adventurous (or just absurdly wealthy), the project should support 1.5–2TB SD cards. I haven’t tested that yet, but if you do please contact me. I’ll happily build a custom UI just for your glorious overkill setup.

- 3D Printed Case (Optional but recommended)

A simple 3D-printable case is included in the project files. It protects the screen, keeps everything neat, and makes it easier to use while traveling. The design is minimalist and easy to print, but if you don't have access to a printer, it's simple enough to recreate by hand using acrylic, wood, plastic, or even LEGO.

Want to customize it? Go for it throw your name on the backplate, add decals, or cut extra holes for ventilation, accessories, or aesthetic flair. I (as an engineering student) recommend tinkercad for modeling lol.

- Software (All Free and Open Source)

  1. SquareLine Studio – For editing the touchscreen UI using LVGL
  2. Arduino IDE or PlatformIO – To compile and upload the code to the ESP32-S3
  3. Web Browser – Used for testing the media portal and UI after flashing

Everything used in this project is free to download and cross-platform (Windows, macOS, Linux). No professional coding experience is needed, if you can copy-paste, follow a few steps, and aren’t afraid of a few compile errors, you’ll be fine.

  1. My code isn’t perfect (it's held together by duct tape and good vibes), but if you get stuck, just drop a comment and I’ll try to help however I can!


Get the Code and SD Card Layout

All source code, firmware, UI files, and a downloadable SD card template with the required folder structure and sample media are available here:

GitHub Repository: https://github.com/Jstudner/jcorp-nomad

Clone or download the repo to get started.

Prepare the SD Card

Screenshot 2025-07-07 200625.png
Screenshot 2025-07-07 200703.png

Before powering up Nomad, you’ll need to prepare the SD card with the correct folder structure, media files, and interface content. This is how your ESP32-S3 knows what to serve and how to present it to connected devices.

  1. Important: The SD card must be formatted as FAT32, or the ESP32-S3 won’t be able to read it properly. (this is a hardware limitation. you can do this using fat32format software linked below.

Formatting SD Cards

Windows won’t let you format cards larger than 32GB as FAT32 by default, but don't worry, there's a free and easy workaround.

Use the GUIFormat Tool:

  1. Download the tool from https://www.fat32format.com/.
  2. Insert your SD card into your computer.
  3. Launch the guiformat.exe program (no install needed).
  4. Select your SD card’s drive letter.
  5. Set:
  6. Allocation size: 32K
  7. Volume label: whatever you want!
  8. Quick Format: ✅ Checked
  9. Click Start. It’ll format the entire card as FAT32, even if it’s 64GB or 256GB.

⚠️ Double-check that you selected the correct drive letter, this will erase everything on that card!


Required Folder Structure

Here’s the standard layout your SD card should follow:

/Books #directory (folder)
/Movies #directory (folder)
/Music #directory (folder)
/Shows #directory (folder)
appleindex.html
index.html
menu.html
books.html
movies.html
music.html
shows.html
favicon.ico
Logo.png
placeholder.jpg
media.json
media.py

A downloadable SD card template is included in the GitHub repository. You can download that directly to your SD card to get started. It include sample media you can use to test before gathering all of your real content.

Requirements:

  1. Books, Movies, Music, and Shows folders must be present, even if they’re empty.
  2. The Shows folder must contain subfolders for each show:
/Shows/The Office/
/Shows/Breaking Bad/
  1. Inside each show folder, place the individual episode video files.
  2. You can rename the media files to whatever you want, but it’s strongly recommended to use a consistent format like:
  3. Shows only take a jpg image for the folder, they should not go inside the folder and the episodes will not use images.
S01E01 - Pilot.mp4
S02E03 - Cool Episode Name.mp4
  1. This helps keep the episodes in order (it sorts alphabetically).

File Descriptions

Here’s what each of the key files does:

  1. appleindex.html
  2. This page is shown only on Apple devices (iPhones, iPads, etc.) due to how iOS handles captive portals. It includes special instructions for connecting and using the system.
  3. index.html
  4. This is the default homepage for all non-Apple devices. It automatically redirects based on device type.
  5. menu.html
  6. The first screen users see after connecting. It displays links to Movies, Shows, Books, and Music. You can remove a section by editing this file and deleting its link (e.g., remove the “Books” link if you're not including books).
  7. books.html, movies.html, music.html, shows.html
  8. These are the individual section pages. They list the content available for each category. a search bar is included that uses in text search, its not perfect, but helps since the only sort method is alphabetical.
  9. For Movies each Movie file (it supports a few video formats but try for mp4 it works best) you should also include a jpg image with the exact same name. I recommend getting your Show and Movie Images from https://www.themoviedb.org/?language=en-US
  10. For Shows each show gets one image, it should be in the /Shows directory and named the same as the directory that your episode files are in. Episodes don't have images, it will just display the filename.
  11. For Books you should use only pdf ebooks, the images should be jpg named the same as the pdf file you want it to match with (both in /Books).
  12. Finally for Music use mp3 files. Music does technically support jpg images, however I never added support to the frontend HTML, you could edit music.html to support this if you wanted, but I liked it without the image.
  13. YOU MUST GENERATE A NEW media.json EVERY TIME YOU EDIT THE FILES. Updated (see below)
  14. favicon.ico
  15. The site’s tiny tab icon. Replace it with your own if you like, but keep the same size and format.
  16. Logo.png
  17. Displayed on the site’s header. Feel free to swap it out with a logo of your own just use the same aspect ratio.
  18. placeholder.jpg
  19. Shown when media items don’t have a cover image. You can replace this too just keep the same size.
  20. Music will be assigned this in media.json, but it doesnt matter since the frontend wont request images.
  21. media.json
  22. This is the database of your media library. It’s read by the interface to display titles and file paths. It must match the files in your folders. This is a SUPER important file, I would not edit this ever unless you know what you are doing. (it contains the paths to images, files, and data for every file on the system.)
  23. media.py
  24. A Python script that scans your folders and generates media.json. You’ll need to run this every time you add, remove, or rename media. **Update** >>> This file is no longer needed, I changed the firmware to automate this so you dont need to do it manually, leaving the file for testing.

Experimental Branch Files:

  1. Admin.html
  2. Allows button press media.json generation > for large file systems (256gb+) I recommend disabling media.json generation on boot in the firmware. Scanning larger libraries can take several minutes and will delay boot / device wont serve web files when scanning.
  3. SD stats, shows total storage, Used storage, and a Indicator bar for that info.
  4. File Manager > lets you rename, delete, and upload files to each media library. It also allows for adding new show folders and then uploading to those subdirectories.
  5. LED control If you use the experimental version of the firmware and admin.html the RGB LED will be off by default, it can be enabled in the admin panel as single selected color or RGB loop.

How to Generate the Media Library (media.json)

After you've added all your content (movies, music, books, etc.) to the correct folders using the format shown:

  1. Make sure Python is installed on your computer.
  2. Open a terminal or command prompt.
  3. Navigate to your SD card directory (e.g., D:\Nomad).
  4. Run the script:
python media.py
  1. This will scan the folders and generate a fresh media.json that the device will use.\
  2. Check the content of media.json and make sure it is showing all of your files. I would test a few files before uploading everything, try one of each filetype/section. Then run media.py, if it works you should see them listed in media.json with the file location, name, and image location. When you run media.py again it will overwrite the contents of media.json so dont worry about issues there.

⚠️ You must rerun this script every time you change the contents of your library. It’s not automatic.

Changed this, you no longer need to update media.json it does it automatically every time the device boots (check for the list of files in serial output), Leaving the instructions and the media.py file in code incase you need it during testing!

What You Can Customize

You can edit any of the HTML or image files using simple tools like Notepad or VSCode. Feel free to:

  1. Change colors and layout in menu.html and section pages
  2. Replace the logo, favicon, or placeholder image
  3. Remove content categories (like Books or Music) by deleting the links in menu.html

Just remember: the system is expecting specific file and folder names, so don’t rename core files unless you know how to update the code to match.

Flashing the Firmware

Screenshot 2025-07-07 200059.png
Screenshot 2025-07-07 110256.png
Screenshot 2025-07-07 120144.png
Screenshot 2025-07-07 120322.png

Now that your SD card is ready, it’s time to upload the firmware to the ESP32-S3 board.

The Waveshare board used in this project makes things easy, it has a USB Type-A male connector, just like a flash drive. You can plug it directly into any available USB port on your laptop or PC, no adapters or extra cables required.

Installing Arduino IDE

If you haven’t already, download and install the Arduino IDE from:

https://www.arduino.cc/en/software

Once installed, open it up, you’ll use this to flash the Nomad firmware to the board.

Opening the Project

  1. Download the firmware files from the GitHub page.
  2. Open the .ino file in Arduino IDE.
  3. Ensure you download all of the files in the "firmware/JcorpNomadProject" directory, when you run the ino those files need to be preset for it to function.
  4. The project should load all necessary tabs and files automatically. (if they dont load check its in the right spot as above)

Board Setup in Arduino IDE

You’ll need to tell Arduino IDE how to talk to the ESP32 board. Follow these steps:

  1. Go to File > Preferences
  2. Under "Additional Board Manager URLs", paste this:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
  1. Then go to Tools > Board > Board Manager
  2. Search for and install “esp32 by Espressif Systems”

Now configure the board:

  1. Board: ESP32S3 Dev Module
  2. USB Mode: CDC on Boot > Enabled
  3. Port: Select the correct COM port once the device is plugged in
  4. Partition Scheme: 16MB Flash (3MB APP/9.9MB FATFS)
  5. PSRAM: OPI PSRAM
  6. Upload Speed: 921600

⚠️ These settings are based on the Waveshare 1.47" display model, other boards may need adjustments. Also check the picture of the settings above.


Flashing the Code

Once everything is set:

  1. Click the Upload (right arrow) button in Arduino IDE.
  2. Wait for the compile and upload process to finish.
  3. If successful, you’ll see a “Done uploading” message.
  4. Check the serial output to see if everything launched correctly. There will be debugging logs for your convenience.

If you get errors, make sure the correct COM port is selected and the board is seated properly. Try pressing the boot/reset button on the ESP32 if needed during upload.

A guide for this ESP32 board can be found at This Link, it may help troubleshooting.

Customizing the Firmware

You can edit a few key values directly in the code:

  1. SSID – The name of the Wi-Fi network Nomad broadcasts
const char* ssid = "NomadServer";
  1. Password – The password to connect
const char* password = "nomad123";
  1. MAX_CLIENTS – How many devices can connect at once
#define MAX_CLIENTS 4


  1. Feel free to change these before flashing, especially if you're setting this up for group use or want a custom network name. You will need to edit the Screen UI to change the display name for SSID on the screen.


Use Library Manager in Arduino IDE (Tools → Manage Libraries) to install any missing ones. Be sure they are compatible with ESP32-S3 boards. The github has a zip file with the exact version I used if you cant get this to work. Ideally they should install correctly but use the zip as a last resort, you can just drop them into your library folder.


Editing the screen UI

  1. You can change what displays on the screen, currently it shows my logo, branding, two sliders for wifi and sd card. and a user count for how many devices are connected.
  2. Editing the screen will involve downloading Squareline studios and using the free version to edit the files in the github. This is more technical so I would recommend looking for a more focused guide if you want to attempt this.


Notes for those who want to run experimental features:

  1. You can clone the Experimental branch from Github and use it in place of the Main branch.
  2. The process is exactly the same as above.
  3. If you just want to upgrade your existing setup just copy over the admin.html file, and replace the .ino file with the one from Experimental.
  4. Adds an admin panel with file management functions, LED Controls, Super basic debugging on the LCD (SD/WIFI), SD information, and DLNA support for VLC media players and some smart TVs.
  5. These features all work, but don't have the same level of testing as the Main branch, report any bugs you encounter so I can patch them!

Library issues:

  1. If you encounter an error while flashing along the lines of: fatal error: <libraryname>.h: No such file or directory
  2. It usually means your libraries are the wrong version. I recommend cleaning out everything in your library folder (usually C:\Users\<yourusername>\Documents\Arduino\libraries on windows) and replacing it with the libraries here (extract the file into libraries)
  3. Then try to re-flash, it should work.
  4. This software is extremely reliant on very specific library versions, so its usually easier to just use the exact versions above than to try and find the correct ones online.

Case

Screenshot 2025-07-07 192338.png
Screenshot 2025-07-07 192350.png
Screenshot 2025-07-07 193108.png

Once your ESP32-S3 board has been flashed and tested, you can enclose it in the 3D-printed case. I strongly recommend waiting until after you’ve verified the device is fully working before snapping the case together, because once that screen goes in, there’s no going back without high risk. I have added two new versions, one is blank so you can add your own branding, the other still uses Jcorp Nomad and my logo, but its a separate object and may work for duel color 3d printing!

Heads-Up Before You Start:

  1. The front screen frame is a very tight fit. Be extremely gentle when pressing it into place. The Waveshare display is strong, but not invincible, cracking it won’t stop the device from working, but it will make you feel very silly.
  2. Test everything before assembling. Seriously. Connect to the Wi-Fi, open the menu, stream a file, only then move on to the case.

Assembly Tips

Front Cover (Screen Side)

  1. Align it carefully, then slowly press it into place.
  2. Be sure to remove the protective film from the screen first, if you forget, there’s no good way to get it off once the case is on.
  3. Avoid removing the front cover after it's installed unless absolutely necessary. If you do, use a plastic pry tool and take your time. Even then, be prepared for regret. This is by design so it doesn't fall off.

Back Cover

  1. The back shell is more forgiving.
  2. You can secure it just by rely on a friction fit, which is what I do (I like to pop it open frequently).
  3. You could also remix the STL and screw, or vent holes depending on your use case. The board has four m3 screw mount points that would be good for this.
  4. I would recommend loading up the back cover file in Tinkercad (or a real cad software) and adding your own flare. My model comes with Jcorp Tech and my logo embossed but you can easily swap it out for your own branding!

🔥 About Heat

This device runs hot. Like, really hot. The ESP32-S3 chip and SD card area can get toasty under load, especially when multiple people are streaming content.

Here’s how to keep it cool:

  1. Add a tiny thermal pad or dab of thermal paste between the ESP32-S3 chip and the case shell
  2. Consider printing with vent holes or using a fan if you're running it in hot environments
  3. Keep an eye on SD card health, high temps can shorten their lifespan, using a quality card will help greatly.

So far I haven’t burned out a board, but I wouldn’t rule it out either. Just plan for heat, and you’ll be fine.

🚫 No Glue, Please

While it may be tempting to permanently bond the case together, don’t. You’ll likely want to:

  1. Swap or update the SD card
  2. Modify the case
  3. Fix something in a later update

The case is designed to hold together with friction, so unless you're throwing it off a cliff, glue really isn’t necessary.

Common Issues & Fixes

Screenshot 2025-07-07 125304.png
Screenshot 2025-07-07 120144.png
Screenshot 2025-07-07 200931.png

Even though Nomad is pretty straightforward, there are a few quirks and bugs I’ve encountered that you might run into too. Here's a breakdown of the most common issues and how to troubleshoot them:

1. SD Card Failure or Read Errors

Symptoms:

  1. Captive portal loads, but crashes after connecting
  2. Device hangs or reboots randomly
  3. Media won’t load or throws read errors
  4. Serial output shows sdmmc_read_blocks failed (0x107) or similar
  5. If you are using the Experimental Branch the SD indicator on the LCD will be off (Grey)

What’s Going On:

  1. The most common cause is the card not being formatted to FAT32. Windows won’t format cards larger than 32GB to FAT32 by default, so I recommend using fat32format.com.
  2. If it was working but suddenly stopped, the card may have overheated or degraded, this is really common with cheap SD cards. It may still work fine on your PC, but the ESP32 is way more sensitive.

Fixes:

  1. Format to FAT32 using the above tool
  2. Check the serial monitor in Arduino IDE, I’ve added debug messages to help pinpoint SD issues
  3. Try a brand-name SD card (SanDisk or Samsung are good bets)
  4. Add a dab of thermal paste or a thermal pad to the chip under the SD card, this helps a lot
  5. If it fails in a loop, you’ll need to unplug/replug the device to reset it, This presents as a working device, but when you try to play or access any media the server crashes and boots you off the wifi.

2. Wi-Fi Not Showing / Redirect Not Working

Symptoms:

  1. You see the Wi-Fi network, but nothing happens when you connect.
  2. It connects, but the page doesn’t load or you’re stuck at a blank screen.
  3. You connect but it just says "cant provide wifi" or "no wifi available".
  4. If you are using the Experimental Branch the WIFI indicator will be off (grey) > if its on WIFI is starting and its likely an issue with the device you are trying to connect.

What’s Going On:

  1. The ESP32 uses a captive portal trick to load the main menu, this works on most phones and laptops, but some devices (especially Android variants) need specific handling
  2. I’ve included separate HTML files (index.html and appleindex.html) for different platforms, the device auto-detects and serves the correct one, Android should be the only one you need to mess with.
  3. That said, some phones (Pixel, OnePlus, etc.) have weird network behavior and may need custom tweaks

Fixes:

  1. Check the serial output, if it says WiFi Online, the network is up and running, but the device handling is messed up.
  2. Make sure appleindex.html and index.html are both present on the SD card
  3. If you're using a "weird" phone model and it's not redirecting, you may need to tweak the code, I’ve added comments in the firmware to help you do that. Check online for what captive DNS endpoint your phone expects and add it to the code following the same format.

3. Range Request Failure (Video Seek Not Working)

Symptoms:

  1. Videos play, but you can’t skip ahead or fast forward
  2. Sometimes causes the player to hang or reload

What’s Going On:

  1. This is due to range request handling, and it is by far the most annoying thing I’ve dealt with
  2. Video players expect the server to respond with very specific byte ranges when skipping ahead, and the ESP32 isn’t great at handling this

Fixes:

  1. If it happens, check the serial monitor, I’ve added tons of logs around range requests for this exact reason
  2. If you get a broken link image (it wont let you pause or play the video, then something else is broken and the range issue is just a symptom)
  3. This is still a work in progress, improvements are welcome!

4. Screen Glitches or UI Breakage

Symptoms:

  1. The screen doesn’t turn on
  2. Graphics are distorted, menus don’t load properly
  3. Display looks fine at first but goes wonky after a few seconds

What’s Going On:

  1. Could be a damaged screen, I’ve broken two Waveshare boards myself, and trust me, it’s easy to do when disassembling
  2. Could also be due to corrupted GUI files from SquareLine Studio
  3. As a note the default screen with my branding shows an sd card and wifi slider, early on I had those as a visual indicator of the status of those systems, I didn't re add it, but those being off isn't an issue, its just lazy coding on my part.

Fixes:

  1. If the screen stays black, confirm your firmware flashed correctly and double-check your display connection, check if the LED is on (if off its not getting power or its a larger firmware problem)
  2. If it’s a graphical issue, try replacing your SquareLine Studio .bin files from a fresh export
  3. If your screen is cracked, sorry… there’s really no saving it. Be gentle when assembling the front cover!

Media Prep & Best Practices

Screenshot 2025-07-07 201103.png

Let’s be real, how you get your media is up to you. Personally, I rip my own DVDs and Blu-rays, which gives me full control over the format and quality. But however you source your movies, shows, music, and ebooks, there are some important formatting rules and optimization tips you’ll want to follow to make everything work smoothly on the Nomad device.

Supported Formats (Very Important)

The ESP32-S3 isn’t exactly a media powerhouse, so we have to keep things lightweight and consistent.

  1. Movies & Shows: .mp4
  2. Keep resolution and bitrate modest (more on this below)
  3. Music: .mp3
  4. Books: .pdf
  5. Images: .jpg
  6. Each Movie, Show folder, and Book should have a matching .jpg file for the poster/cover image


Tip: There’s an included script called img.py that you can run to compress all .jpg files in a folder. It helps save space and keeps load times fast. (smaller images load quicker in the web UI)

Optimize Videos with HandBrake

HandBrake is an awesome free tool for converting and compressing videos. I use it to prep almost all of my media for Nomad.

Why compress?

  1. Lower file size = faster load & less heat
  2. Avoids crashes during playback
  3. Saves SD card space = more media space

🔧 Recommended HandBrake Settings

  1. Open HandBrake and drag your video file in, or select a file with multiple and que them.
  2. Under Format, choose: MP4
  3. Under Video tab:
  4. Preset: Fast 480p (check web optimized on)
  5. Video Codec: H.264 (x264)
  6. Framerate (FPS): Same as source, Constant Framerate
  7. Quality: Use the RF slider, set it to around 22–24 for a good size/quality balance
  8. Under Audio tab:
  9. Keep a single stereo track, AAC codec
  10. Under Subtitles:
  11. Burn In any you need.
  12. If you don't burn them in (say for anime) they will not show up. so be sure to do this if you need it.
  13. File naming:
  14. For episodes, I recommend naming like:
  15. S01E01 - The Pilot.mp4
  16. Keeping things alphabetized will prevent playback order issues, media.py sorts alphabetically so plan for that.

Once you're happy with your settings, click "Start Encode" and you’re good to go. For more detailed steps check online, handbrake is widely used and well documented. If you are in a rush or have tons of files (or just willing to use more space just doing the fast 480p preset and web optimizing is usually fine for most uses.


  1. As a note the device will support better video quality, but there are limits. you can expect about 3mbs best case scenario if you are close to Nomad. That speed gets split between the number of active streams (so two streams get 1.5mbs each). With careful encoding this device can technically support 1080p, but again that will be slower and less reliable depending on your settings. Better quality also means larger file size = less media overall.


Clean Folder Structure

Nomad depends on a specific folder and file layout to function properly. Here’s what it should look like:

/Movies/
Interstellar.mp4
Interstellar.jpg
/Shows/
The Office/
S01E01 - Pilot.mp4
S01E02 - Diversity Day.mp4
The Office.jpg //NOT in "/The Office", it's in "/Shows" with the office folder not inside the office folder.
/Books/
The Martian.pdf
The Martian.jpg
/Music/
track01.mp3
albumcover.jpg //This wont show up so you realy dont need to include it, just for potential future explansion.

You’ll then run the media.py script (explained in the SD setup section) to generate the media.json file the UI uses to populate the menus.

Naming Tips

  1. Keep file names simple and clean (avoid emojis, long symbols, or extra punctuation)
  2. For shows, using SxxExx - Title helps avoid weird sorting issues
  3. Covers must match the name of the main media file/folder (e.g., Interstellar.mp4 + Interstellar.jpg)

Conclusion & What’s Next

Thanks for checking out the Jcorp Nomad Project!

What started as a quick fix for bad inflight entertainment turned into a deep dive into embedded hardware, networking, and UI design, and while it’s far from perfect, I’m proud of how far it’s come. Whether you’re using it for camping trips, road travel, or as a DIY digital library for your kids, I hope it helps solve a small problem in a big way.

Of course, there’s still a lot more I want to build into it. Here are a few things I’m hoping to add in future updates (or better yet, maybe someone else will beat me to it):

Offline Maps with GPS Support

Inspired by the Backcountry Beacon project, I’d love to integrate GPS-based map tiles that let you see your position even with no signal. I’ve tested a few ideas but haven’t nailed it yet.

HTML5 Games

I'm also looking into embedding lightweight browser games, similar to Gams Offline. Most of these will only work with a keyboard, but still would be cool to have as an option since they don't take up much drive space.

Audiobook-Friendly Mode

Right now, audiobooks work just fine through the Music section, but I’d like to build a proper book player UI with better pause/play memory and maybe chapter markers. If you love audiobooks, this is coming.. eventually.

File Upload Over USB

This is the holy grail. In theory, the ESP32-S3 supports USB Mass Storage mode, but every time I’ve tried it, something breaks (usually the SD card). The problem is it cant do both the media server and USB at the same time, and switching was tricky. If anyone figures out how to read and write to the SD card over USB, please message me I’ll happily add it as an official feature.

  1. Experimental mode includes a file management system that works over the WEB UI. Its much slower, but a good option for anyone who doesn't always have access to a computer.

Variant Builds & Expansion Ideas

  1. There’s a headless version of this project (no screen) that runs on cheaper hardware and can use a battery. It’s great if you just want portable Wi-Fi media on a budget.
  2. I’ll be adding a variant for the ESP32-S3 Super Mini board to GitHub soon. It’s not smaller, and requires a soldered SD card module, but its great for battery-powered setups.
  3. I’m even playing with the idea of building this into a phone charger battery pack, with a switch to activate Nomad in addition to charging devices. There is lots of potential for this device, please share your own versions!
  4. By popular demand I am working on a slightly larger and slightly more expensive version of this that supports 4K and more video streams.

If you decide to build your own version of Nomad, I’d love to see it. Share photos, fork the repo, or just drop a comment if you get stuck or come up with a cool feature idea. I made this project public because I know others can help take it further than I can on my own.

Happy hacking ✌️

Jackson Studner

*(P.S. Don’t break your screen. Seriously. Be gentle.)