My files
Termux server offline. This link waits for your phone. Start ./start.sh and it'll reconnect automatically, no need to refresh.
Save new uploads to:
Drop files here or click to browse
Any file type · Multiple files · Drop a folder to keep its structure
0 selected
JEPFX CLOUD · Powered by direct edge streaming · raw index
Settings: API & Integration
Max upload size
Stored right now
This is everything another app, backend, or AI assistant needs to talk to this storage server: the endpoint plus the username/password sent as HTTP Basic Auth. Point any of your other websites here instead of relying on their own (wipeable) disk.
Send this as either header on any /api/* request — no username, no password, and it never asks for a one-time code, even if OTP login is turned on for this account: X-API-Key: <key> or Authorization: Bearer <key>. Regenerating instantly invalidates the old key everywhere it's in use, so only do that if you actually need to revoke access.
Required on regular user accounts. Change it here anytime.
Changing this here updates the running server and is saved to a local config file, so it survives a normal restart. If this server runs on a host that wipes its disk on every redeploy (like Render's free tier), set JEPFX_USER / JEPFX_PASSWORD as real environment variables there instead so it sticks.
Paste the copied guide straight into an AI assistant (Claude, ChatGPT, etc.) along with something like "use this as the file storage backend for my app" — it has everything needed to wire up uploads/downloads without you explaining the API by hand.
Got a spare or old phone lying around? Link it to this account only and it becomes a real upload destination — files you send there actually live on that phone, not this server. Requires Termux on that backup phone, and it needs to stay on and connected for those files to be viewable/downloadable — same idea as the Telegram storage option, just pointed at hardware you own.
  1. Tap Generate setup command below. It's a one-time link, good for 20 minutes, tied to your account only.
  2. On the backup phone: install Termux (F-Droid build), open it, and paste + run the copied command.
  3. It downloads a small standalone server, starts it, opens its own tunnel, and registers itself with your account automatically — no URL to copy or paste.
  4. Once it shows "online" below, pick it under Save new uploads to on the main screen for any upload you want stored there instead of this device.
  5. Leave that Termux session running. If you close it, files on that phone just wait until you run it again — nothing is lost, they're simply unreachable meanwhile.
Loading…
Total bonus storage
Users you add can sign in with their own username/password, but only inside their own private folder — they never see yours or each other's.
🔋 Battery
Loading…
CPU load
RAM
Connection
⏱ Phone uptime
Termux storage
Loading…
This month
Loading…
Loading…
Loading…
Every export VAR=value this project understands, pulled from server.js, start.sh and the relay — set these on the phone (in ~/.bashrc or just before running ./start.sh) before they'll take effect.
Login & server
JEPFX_USERAdmin login username. Default: JEPFX
JEPFX_PASSWORDAdmin login password. Change this before sharing any public link. Default: @JEPFX_1875
PORTPort the server listens on. Default: auto-picks the first free one from 8080, 8081, 8082, 8083, 8090, 8099, 3000, 9090
Uploads & storage limits
MAX_UPLOAD_MBLargest single file this device's local storage will accept. Default: 20480 (20GB)
DEFAULT_USER_QUOTA_MBStarting storage quota given to a newly added user. Default: 1024 (1GB)
UPLOAD_CHUNK_MBSize of each chunk the browser splits an upload into. Default: 8
SERVICES_VIDEO_MAX_MBMax size for a video uploaded on the Services page. Default: 500
ALBUM_MAX_MBMax size per file uploaded to the Album. Default: 200
UPDATE_MAX_MBMax size accepted for a self-update package. Default: 300
Rate limiting & misc
DOWNLOAD_BURST_MAXDownloads allowed in a burst before rate-limiting kicks in. Default: 5
DOWNLOAD_BURST_WINDOW_MSLength of that burst window, in ms (alias: DOWNLOAD_COOLDOWN_MS). Default: 30000 (30s)
NOTES_PINPIN protecting the Notes page. Default: 021907
Public tunnel (start.sh)
TUNNEL_NAMEName of a pre-created named Cloudflare Tunnel. When set, start.sh manages it directly (permanent domain, forced http2, auto-restart) instead of opening a throwaway quick tunnel.
PORT_CANDIDATESSpace-separated list of ports to try, in order, instead of the built-in default list.
Permanent relay link (optional)
RELAY_URL / RELAY_SECRETRegisters this phone with a deployed relay (e.g. Render) so a fixed link always finds it. Add more with _2 through _5 suffixes to register with several relays at once.
REGISTER_SECRETSet on the relay deployment itself, not the phone. Shared secret the phone's RELAY_SECRET must match.
SELF_PING_URL / RENDER_EXTERNAL_URLRelay-side. Public URL the relay pings itself every 10 min so a free Render plan doesn't spin down and cold-start 502.
DISABLE_SELF_PINGRelay-side. Set to 1 to turn that self-ping off (e.g. on a paid plan that doesn't spin down).
Anyone with the link can view and download from /services — only you can add, rename, replace, or delete entries, or add more tabs of your own. Every upload is also copied into a Services/<tab> folder in your regular Files view, under its real filename, so you can find/check it there too. On the Service Tool tab, each entry can also carry a short preview video — upload a clip or paste a YouTube/Vimeo/direct link — which plays above the download button on the public page, with the description underneath for anyone who'd rather just read.
Loading…
This tab's uploads go to:
Loading…
Keys let outside scripts/devices pull the firmware list and download files from /api/public-services/firmware — see the API docs for how to use one.
Loading…
Give someone a permanent code and they can log in at /firmware to add firmware themselves — same upload form and file pipeline as this panel, landing in the same Firmware tab above. Once they're signed in, their own downloads/links inside /firmware skip the rotating OTP entirely; the permanent code already proves who they are.
Loading…
Upload pictures here as your public proofs of work. They show up on /album as a full-screen morphing gallery that works on phone, tablet, and PC (landscape or portrait). Anyone with the link can view; only you can add, edit, or delete.
Choose pictures, or drag them here (up to 500)
Title / kicker / caption above are applied only when uploading a single picture. For batch uploads, filenames become the default title and you can edit each one after.
Loading…
Browse this project's own files below, just like GitHub's file browser, and upload a replacement for any file — it overwrites whatever already has that name in the folder you're viewing. Your uploaded files, user accounts, and login are never shown here and can never be touched from this tab. Looking for uploaded content instead of project code — your own Cloud files, every user's private storage, Services, and Album — open All Files.
Uploading a file with a name that already exists here backs it up first (to .jepfx-update/backups/) and then replaces it. A backend file like server.js needs Restart server afterwards to take effect — front-end files under public/ just take effect on next page load.
No files replaced yet.
Package this whole setup into a single .tar.gz you can pull onto another phone with one curl command — for moving to a new phone, cloning a spare one, or just keeping an offline backup. Admin only.
  1. On this phone: tick the box below if you want a full clone (your files, user accounts, and login) — leave it unticked to send over just the app.
  2. Copy the one-line migrate & deploy command further down this tab.
  3. On the new phone: install Termux (the F-Droid build, not Play Store), open it, and run pkg install curl tar once if either command isn't found yet.
  4. Paste the copied command into that Termux session and run it. It downloads the archive, extracts it into a fresh jepfx-cloud folder, runs install.sh (Node.js, cloudflared, npm install), and starts the server — all in one line.
  5. When it finishes you'll see the same local-address / public-link output as any normal ./start.sh — the new phone is now a live, independent copy. If you chose the full clone, your files and logins carried over too; otherwise it starts fresh with the default admin login (change it from this same Settings panel).
Package size
Items included
Both commands carry your admin password in plain text — paste them straight into the new phone's terminal and nowhere else. Use whichever address that phone can reach: your local network address on the same Wi-Fi, or the public/relay link from anywhere else. The migrate command already extracts, runs install.sh, and starts the server for you; the plain download just saves the .tar.gz so you can move/extract it yourself later.
A self-contained written copy of everything on this tab — the steps, both commands, and troubleshooting notes. Handy to send to yourself (chat/email/notes app) before you switch phones, or to paste into an AI assistant if something doesn't go as expected on the new end.
A written reference for running and fixing this server yourself, without needing to ask an AI each time. Covers starting/stopping, where things live, and the errors that come up most often. Admin only.
Controls where the dashboard's "New request" card sends itself. Turn on either channel below (or both) — visitors never see this, they just get a confirmation once it's on its way to you.
Adds a second step to the admin login only — regular user accounts are never affected. Once on, every admin sign-in (including "keep me signed in" restores after the code expires) needs a 6-digit code texted to the chat above, on top of the password.
Message @BotFather on Telegram to create a bot and get its token. To find your chat ID, message your new bot once, then open https://api.telegram.org/bot<token>/getUpdates in a browser and read chat.id from the response.
Adds a second step to the admin login only — regular user accounts are never affected by this one. Once on, every admin sign-in (including "keep me signed in" restores after the code expires) needs a 6-digit code emailed to the address above, on top of the password. If Telegram's login code is also turned on, both are sent and either one will get you in.
A separate second step for regular user accounts — the admin login toggle above is unaffected. Once on, every regular user sign-in (including "keep me signed in" restores after the code expires) needs a 6-digit code emailed to their own Gmail address on file, on top of their password — using this same SMTP mailbox to send it, just addressed to them instead of the address above. Accounts that don't have a Gmail on file yet are skipped until they add one.
Independent of the one-time codes above — this isn't a code to enter, it's a heads-up sent right after a login succeeds (including a restored "keep me signed in" session), with the time, IP address, and device. Useful as a tripwire: if the OTP step above is off, gets guessed around, or a remembered session gets reused by someone else, you still get an email saying the account was just used.
Same idea as above, but for regular user accounts — sent to each user's own Gmail on file, not a code, just a login notice with time/IP/device. Accounts without a Gmail on file are skipped.
Works with Gmail (create an app password at myaccount.google.com/apppasswords), most hosting-panel mailboxes, or any generic SMTP relay.
Loading…