This guide walks you through the complete setup — from zero to a live file hosting platform. No coding needed. Follow the steps in order and you'll be live in about 30 minutes.
✅ Before you start — what you need
A Telegram account — this is where your files are stored (free, unlimited)
A free Supabase account — stores your upload records and user logins
A free Vercel account — hosts your website
A free GitHub account — connects your website code to Vercel
About 25–35 minutes for the full setup
💡
How the storage works.Files your users upload are sent to a private Telegram channel via a bot. Telegram stores them for free — no limits, no bills. Your website reads them back through your own domain so users never see any Telegram links. It's completely invisible to your visitors.
🗺️ The 5 steps at a glance
🗄️
Set up SupabaseCreate a free database and run one SQL file
Step 1
✈️
Create a Telegram botTakes 2 minutes — BotFather does everything
Step 2
📢
Create your storage channelA private Telegram channel where files are stored
Step 3
⚙️
Set environment variablesPaste your keys into Vercel — the guide shows exactly what goes where
Step 4
🚀
Deploy to VercelConnect GitHub and click Deploy — done
Step 5
✅
Everything is free after purchase. Supabase, Vercel, GitHub, and Telegram are all free. You pay $0/month to run your platform.
docs / getting started
What You Need
Four free accounts. That's it. Sign up for all of them before starting — each takes about 2 minutes.
✈️ Telegram
You need a Telegram account. If you don't have one, download the app from telegram.org and sign up with your phone number. It's free.
🌐 Three free web accounts
Supabase — supabase.com — free database and user login system. Sign up with email or Google.
GitHub — github.com — stores your website code. Sign up with email.
Vercel — vercel.com — free hosting. Sign up with your GitHub account (easiest).
✅
All set? Once you have your Telegram account and the three web accounts created, move on.
docs / getting started
Setup Supabase
Supabase is your free database — it keeps track of every file your users upload, who uploaded it, and handles optional user logins.
① Create a new project
1
Log in and click "New Project"
Go to supabase.com → Dashboard → click the green "New Project" button.
2
Fill in the project details
Name: anything (e.g. "zynu-host") Database Password: pick something strong and save it — you'll need it later. Region: pick the closest to your audience.
3
Wait ~1 minute for the project to be ready
Supabase sets up your database automatically. A green checkmark appears when done.
② Run the database schema
1
Open the SQL Editor
In your Supabase project, click SQL Editor in the left sidebar.
2
Paste the schema file and click Run
Open the file supabase/schema.sql from your purchase ZIP. Select all the text, copy it, and paste it into the SQL Editor. Click the green "Run" button. Wait a few seconds — this creates all the tables your platform needs.
3
Verify the tables were created
Click Table Editor in the sidebar. You should see three tables: images, error_logs, and rate_limits. If you see them, you're done.
③ Copy your API keys
Go to Project Settings → API. Copy and save these three values:
Supabase → Settings → API
Project URLhttps://xxxxxxxxxxxx.supabase.coanon public keyeyJhbGci... (long string)service_role keyeyJhbGci... (different long string)
⚠️
Keep the service_role key secret. Never share it or put it in public code. It gives full access to your database.
④ Enable Google login (optional)
If you want users to be able to sign in with Google to track their uploads:
1
Enable Google provider
Supabase → Authentication → Providers → Google → toggle it on.
2
Set your redirect URL
Supabase → Authentication → URL Configuration: Site URL: https://your-project.vercel.app Redirect URLs: https://your-project.vercel.app/api/auth/callback (Update these once you know your Vercel URL after deployment.)
3
Get Google OAuth credentials
Go to console.cloud.google.com → create a project → APIs & Services → Credentials → OAuth 2.0 Client. Copy the Client ID and Client Secret into the Supabase Google provider fields.
💡
Google login is optional. Your platform works fully without it — users can upload without any account. You can skip this step and add it later.
✅
Supabase done. You have your Project URL, anon key, and service_role key saved. Now set up your storage.
docs / storage setup
Create Your Telegram Bot
Your bot is the bridge between your website and Telegram storage. When a user uploads a file, the bot receives it and sends it to your private channel. Creating a bot takes about 2 minutes.
1
Open Telegram and search for @BotFather
Open Telegram on your phone or desktop. In the search bar, type @BotFather — it's the official Telegram bot creation tool (blue checkmark). Tap it and press Start.
2
Send /newbot
Type and send:
Telegram → @BotFather
/newbot
BotFather will ask you to choose a name for your bot.
3
Give your bot a name and username
First it asks for a display name — type anything, e.g. My Host Bot.
Then it asks for a username — must end in bot, e.g. myhost_storage_bot. If the name is taken, try adding numbers.
4
Copy your bot token
BotFather replies with a message containing your bot token. It looks like this:
Your bot token (example)
123456789:AAFxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Copy and save this token. You'll need it in the environment variables step. Treat it like a password — don't share it.
⚠️
Keep your bot token secret. Anyone with this token can control your bot. Never put it in public code or share it.
docs / storage setup
Create Your Storage Channel
Your files are stored inside a private Telegram channel. Think of it as an invisible hard drive — nobody sees it except your bot, and it's completely free with no size limit.
① Create a private channel
1
Create a new channel in Telegram
Mobile: Tap the pencil/compose icon → New Channel. Desktop: Click the pencil icon → New Channel.
Give it any name (e.g. "Host Storage"). Set it to Private. You don't need to add any subscribers.
2
Add your bot as an admin
Open the channel → click the channel name at the top → Administrators → Add Admin.
Search for your bot's username (e.g. myhost_storage_bot) and add it. Give it "Post Messages" permission (this is the only one needed). Save.
3
Send a test message in the channel
Type and send any message in the channel — just type "test" and send it. This is needed to find the Channel ID in the next step.
docs / storage setup
Get Your Channel ID
Every Telegram channel has a unique ID number. Your website needs this number to know where to send uploaded files. Here's how to find it.
1
Open this URL in your browser
Replace YOUR_TOKEN with your actual bot token, then paste the full URL into your browser's address bar and press Enter:
Paste in browser address bar
https://api.telegram.org/botYOUR_TOKEN/getUpdates
Example: if your token is 123456789:AAFxxx... the URL becomes: https://api.telegram.org/bot123456789:AAFxxx.../getUpdates
2
Find your Channel ID in the response
The page shows a block of text. Look for a section that looks like this:
The number next to "id" — starting with -100 — is your Channel ID. Copy the full number including the minus sign.
3
Save the Channel ID
It looks like: -1001234567890. Keep it alongside your bot token — you'll paste both into Vercel in the next steps.
⚠️
The page shows an empty result? Make sure you sent a message in the channel after adding the bot. The bot only registers the channel ID after it sees a message. Go back, send a message, then refresh the URL.
✅
Storage setup complete. You now have: bot token and channel ID. Combined with your Supabase keys, you have everything needed to deploy.
docs / deploy
Environment Variables
Environment variables are the settings that connect your website to Supabase and Telegram. Think of them as the keys and addresses your platform needs to function.
You collected all these values in the previous steps. Here's exactly what each one is and where it goes:
All 7 environment variables
NEXT_PUBLIC_SUPABASE_URL← Supabase → Settings → API → Project URLNEXT_PUBLIC_SUPABASE_ANON_KEY← Supabase → Settings → API → anon public keySUPABASE_SERVICE_ROLE_KEY← Supabase → Settings → API → service_role keyTELEGRAM_BOT_TOKEN← from @BotFather (e.g. 123456789:AAFxxx...)TELEGRAM_CHANNEL_ID← Channel ID (e.g. -1001234567890)NEXT_PUBLIC_APP_URL← your Vercel URL (e.g. https://myhost.vercel.app)ADMIN_SECRET← any password you choose (for the admin panel)
💡
NEXT_PUBLIC_APP_URL — you won't know this until after you deploy to Vercel. For now, put a placeholder like https://placeholder.vercel.app. After deployment, come back and update it to your real URL.
💡
ADMIN_SECRET — pick any password you want. This is the password you'll use to access your admin error log panel at /admin/logs. Write it down somewhere.
docs / deploy
Deploy to Vercel
Now you'll put the website online. Vercel hosts it for free — click Deploy and your file hosting platform is live in about 2 minutes.
1
Upload the website files to GitHub
Go to github.com → click "New repository" → name it (e.g. "zynu-host") → click "Create repository".
On the next screen, click "uploading an existing file". Drag all files from your purchase ZIP into the upload area and commit them.
2
Import the repo in Vercel
Go to vercel.com → "Add New Project" → "Import Git Repository" → select the GitHub repo you just created.
3
Add all 7 environment variables
Before clicking Deploy, scroll down to "Environment Variables". Add all 7 variables from the previous step — one by one, name on the left, value on the right.
4
Click Deploy
Vercel builds and deploys in about 1–2 minutes. You get a free URL like your-project.vercel.app.
5
Update NEXT_PUBLIC_APP_URL
Now you know your real URL. Go to Vercel → your project → Settings → Environment Variables → edit NEXT_PUBLIC_APP_URL and set it to your actual Vercel URL (e.g. https://your-project.vercel.app). Click Redeploy for the change to take effect.
🎉
Your file hosting platform is live! Open the URL and try uploading a file. You should see the upload progress, then a permanent sharing link appear. Share your platform link with the world.
💡
Want a custom domain? Go to Vercel → your project → Domains → add your domain name. Vercel handles the SSL certificate automatically.
docs / deploy
Add Adsterra Ads
File hosting platforms attract consistent, repeat traffic — users return every time they need a file link. That makes it ideal for Adsterra ads.
1
Sign up as a Publisher at adsterra.com
Go to adsterra.com → Sign Up → choose Publisher. Verify your email.
2
Add your website
Dashboard → Sites → Add Site. Enter your Vercel URL. Category: Technology / File Hosting. Adsterra typically approves within 24 hours.
3
Get your ad code
Once approved: Sites → your site → Get Code. Choose Banner or Social Bar. Copy the snippet.
4
Paste the code into app/layout.tsx
Open app/layout.tsx from your files. Paste your Adsterra snippet just before the closing </body> tag:
app/layout.tsx — paste here
<body>{children}/* ← paste Adsterra code here */</body>
Upload the updated file to GitHub. Vercel auto-redeploys in ~1 minute.
docs / troubleshooting
Deploy & Build Errors
Common issues when deploying to Vercel.
Make sure all files from the purchase ZIP were uploaded to GitHub, including package.json.
Check that you didn't accidentally only upload a subfolder — all files should be at the root level of the repo.
Try triggering a manual redeploy: Vercel → Deployments → three dots → Redeploy.
The most common cause is missing environment variables. Go to Vercel → Settings → Environment Variables and check that all 7 are set.
Double-check NEXT_PUBLIC_SUPABASE_URL — it must start with https:// and end with .supabase.co
Make sure NEXT_PUBLIC_APP_URL is set to your actual Vercel URL (not localhost).
After fixing any env var, click Redeploy.
Go to Supabase → Authentication → URL Configuration and update the Site URL and Redirect URL to your real Vercel URL.
Also update your Google OAuth credentials (in Google Cloud Console) to include your Vercel URL as an authorized redirect URI.
docs / troubleshooting
Upload Not Working
Issues when users try to upload files to your platform.
Double-check TELEGRAM_BOT_TOKEN in Vercel env vars — copy it again from @BotFather to make sure there are no typos or extra spaces.
Double-check TELEGRAM_CHANNEL_ID — it must include the minus sign (e.g. -1001234567890).
Make sure you added the bot as admin with Post Messages permission in the channel.
Send a message in the channel, then try uploading again.
Your platform limits uploads to 20 per hour per IP address to prevent abuse. Wait an hour and try again.
This is intentional — it protects your platform from being used for spam.
The default file size limit is 4MB per upload.
This is set by Vercel's serverless function body limit. The limit can be increased if you switch to a paid Vercel plan.
For most images, PDFs, and documents, 4MB is more than enough.
Some websites block external fetching of their files. If the URL is from a site that protects its content, the upload will fail.
Try with a direct file URL (ending in .jpg, .pdf, .zip etc.) rather than a page URL.
Make sure the file at the URL is under 4MB.
docs / troubleshooting
Storage & File Issues
Issues with files after they've been uploaded.
This can happen if the Telegram file URL has temporarily expired (Telegram URLs expire periodically). Try refreshing the page — your platform automatically fetches a fresh URL.
If it persists, check that TELEGRAM_BOT_TOKEN and TELEGRAM_CHANNEL_ID are correct in your Vercel env vars.
Visit /admin/logs?secret=YOUR_ADMIN_SECRET to see if any telegram_error entries appear — they will tell you exactly what failed.
This is expected behaviour. Deletion removes the file record from your database — so the link stops working on your platform.
However, the file physically stays inside the Telegram channel because Telegram doesn't allow bots to delete files from channels.
In practice: the public link is dead and nobody can find the file. The raw Telegram file still exists but is inaccessible without the internal file_id.
Go to Supabase → Table Editor → images table. You can see every upload with its file size, upload time, slug, and user ID.
Logged-in users can also view their own uploads at /akun (the account dashboard).
Visit /admin/logs?secret=YOUR_ADMIN_SECRET (replace with the password you set for ADMIN_SECRET).
This shows all logged errors: upload failures, Telegram errors, database errors, auth errors, and rate limit hits.
You can filter by type: /admin/logs?secret=xxx&type=telegram_error
💬
Still stuck? Contact support on Telegram — included with your purchase. Contact support →