Your account request is waiting on the admin to approve it. You'll be able to sign in with this username and password once it's approved.
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
Folders
filestap a file to preview · ⋯ for more
Title
Gmail address required
Your account doesn't have a Gmail address on file yet. Please add one to continue — you can change it anytime later from Settings.
Enter a valid Gmail address.
Settings: API & Integration
API access is turned off for your account.
Ask your admin to enable it for you in Settings → Admin if you need to
connect another app to this storage.
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.
API access is turned off for your account.
Ask your admin to enable it for you in Settings → Admin if you need
the integration guide.
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.
Extend Storage is turned off for your account.
Ask your admin to enable it for you in Settings → Admin if you want to
link a spare phone as extra storage.
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.
Tap Generate setup command below. It's a one-time link, good for 20
minutes, tied to your account only.
On the backup phone: install Termux (F-Droid build), open it, and paste
+ run the copied command.
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.
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.
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.
Device status
🔋 Battery—
Loading…
CPU load
—
RAM
—
Connection
—
⏱ Phone uptime
—
Device storage
Termux storage
Loading…
Used space over time
Lovable Cloud bandwidth
This month
Loading…
Monthly limit
Your current Lovable plan grants 20 credits/month total. Cloud/data-transfer is charged by credit, not a fixed GB cap, so this GB limit is a custom tracker.
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.
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.
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.
Uploading… 0%
Pictures in the album
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…
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.
↻
Restarting the server… This page will reconnect automatically.
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.
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.
Copy the one-line migrate & deploy command further down this tab.
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.
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.
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
—
The tar command isn't available on this server, so exports can't run
yet. In Termux: pkg install tar, then reopen this tab.
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.
Telegram bot
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.
SMTP email
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.