Documateo · Dashboard
// Your growth command centre
All saved ✓
🧭 How to use this dashboard (read this first!)
You're a complete beginner — that's perfectly fine. This dashboard was built to guide you step by step. Here's how it works:
1
Navigate using the left sidebar — each section has a specific focus (Today's tasks, SEO, Monetization, etc.)
2
Click any task item to mark it as done (it turns green with a ✓). Click again to unmark.
3
Click "▼ Show Steps" on any task — this reveals a detailed step-by-step guide written for beginners. Every task has one.
4
Press "💾 Save Progress" after completing tasks. Your progress saves to your browser — it won't disappear unless you clear cache.
5
Use "Backup / Restore" to export your progress as JSON and paste it into a Google Doc or Notion. Do this weekly!
6
Start with "🔥 Do Today" in the sidebar — it shows your most urgent 8 tasks right now.
Big win already done! Cloudflare Pages Function is deployed. Google can now read all 48 tool pages + 90 blog posts. The #1 technical blocker is fixed. Now focus on getting those pages indexed.
Tools Live
48
32 PDF · 14 Image · 2 Video
Blog Posts
90+
Sitemap submitted to GSC
Indexed Pages
34
Update as GSC shows more
Revenue Streams
3
Ads · Affiliate · PRO
🔥 This Week's Priority
Deploy Cloudflare Pages Function
DONE ✅ Google can now read all pages
Request indexing for all 102 pages in GSC
CRITICAL 10 pages/day limit
Create Privacy Policy + About page
CRITICAL AdSense requirement
Apply for Google AdSense
HIGH 15 min to apply
Install Microsoft Clarity (free heatmaps)
HIGH 15 min · FREE forever
Resubmit sitemap in Google Search Console
HIGH 2 min
📈 Revenue Forecast
MonthEst. VisitsEarnings
Month 1500–2k₹300–₹1,100
Month 22k–6k₹1,500–₹5,300
Month 36k–15k₹4,000–₹13,000
Month 415k–30k₹9,500–₹27,000
Month 530k–60k₹21,000–₹51,000
Month 660k–1.2L₹46,000–₹1,23,000
Revenue = Ads (50%) + Affiliates (30%) + PRO subs (20%). Grows exponentially as SEO compounds.
📊 Overall Task Progress
0 tasks completed0%
Monetization SEO & Blog Tool Roadmap Security Legal & Safety Reachability
The Cloudflare Function is live. Google's crawlers noticed the change. The window for fast indexing is open RIGHT NOW — every day you delay costs you organic traffic. Do these tasks today.
⚡ Right Now — Next 2 Hours
Cloudflare Pages Function deployed ✅
DONE Google can now read all pages
Request indexing: 10 priority pages in GSC URL Inspection
CRITICAL 10/day limit · do top tools first
📋 Step-by-Step Guide — Requesting Indexing in Google Search Console
⚠️ What is Google Search Console? It's a free tool by Google where you can see how your website appears in Google search. You should have already set this up when you added your domain. If not, go to search.google.com/search-console first.
  1. 1
    Open your browser and go to: search.google.com/search-console — log in with the same Google account you used to set it up.
  2. 2
    In the left sidebar, click "URL Inspection". A search bar will appear at the top of the page.
  3. 3
    Type or paste your first URL: https://documateo.com/pdf/merge — then press Enter. Wait about 5-10 seconds for the result to load.
  4. 4
    You'll see a status message. Look for a button that says "Request Indexing" — click it. Google will put that page in the indexing queue.
  5. 5
    Repeat this for the other 9 priority pages (below). You're limited to 10 per day. Google usually indexes them within 24-72 hours.
📌 Today's Priority Order:
1. /pdf/merge → 2. /pdf/compress → 3. /pdf/split → 4. /image/remove-bg → 5. /image/compress → 6. /pdf/pdf-to-word → 7. /image/resize → 8. /pdf/protect → 9. /video/extract-audio → 10. /pdf/rotate

Do 10 today, 10 tomorrow, and continue each day for ~10 days until all 102 pages are requested.
▼ Show Steps
Resubmit sitemap.xml in Google Search Console
CRITICAL 2 min · tells Google "everything changed, re-crawl"
📋 Step-by-Step Guide — Resubmitting Your Sitemap
⚠️ What is a sitemap? It's a file called sitemap.xml that lists all the pages on your website. It helps Google discover your pages faster instead of searching randomly. You should already have one at: documateo.com/sitemap.xml
  1. 1
    Go to search.google.com/search-console and log in.
  2. 2
    In the left sidebar, scroll down and click "Sitemaps" (under the Indexing section).
  3. 3
    You should see your existing sitemap already listed (something like sitemap.xml). If not, type sitemap.xml in the "Add a new sitemap" box and click Submit.
  4. 4
    If your sitemap is already listed, click the 3-dot menu (⋮) next to it → click "Resubmit". This tells Google: "I've made changes, please come and re-read everything."
  5. 5
    Google will show "Pending" status — this is normal. It can take 24-72 hours to start crawling.
💡 Do this right after your Cloudflare fix. Since Google now gets different HTML (with real content instead of a blank page), resubmitting tells it to come back and re-read everything.
▼ Show Steps
📅 This Week — Before Friday
Create Privacy Policy page at /privacy-policy
CRITICAL 20 min · required for AdSense approval
📋 Step-by-Step Guide — Creating a Privacy Policy (Beginner-Friendly)
⚠️ Why do you need this? Google AdSense requires every website that shows ads to have a Privacy Policy page. Without it, you'll be instantly rejected. This explains to users what data you collect (even basic things like cookies). You do NOT need a lawyer — free generators work fine.
  1. 1
    Open a new tab and go to: privacypolicygenerator.info — this is a free, trusted tool used by thousands of websites.
  2. 2
    Fill in the form: Website Name = Documateo | Website URL = https://documateo.com | Country = India | State = your state.
  3. 3
    On the next page, tick these boxes: ✅ Google Analytics ✅ Google AdSense ✅ Log Data ✅ Cookies ✅ Third-party links. Then click "Generate Privacy Policy".
  4. 4
    Click "Select All" and copy the entire generated text. This is your privacy policy.
  5. 5
    In your website's code (React frontend), create a new page route at /privacy-policy. Paste the privacy policy text there as a simple text/HTML page.
  6. 6
    In your website footer, add a link that says "Privacy Policy" pointing to /privacy-policy. AdSense reviewers specifically look for this footer link.
  7. 7
    While you're at it, use the same generator to create a Terms of Service page at /terms-of-service. Same process, different option on the generator.
💡 The #1 reason tool websites get AdSense rejected is missing legal pages. Do this BEFORE applying for AdSense. Takes 20 minutes, pays dividends forever.
▼ Show Steps
Write About page (200+ words, founder story)
CRITICAL 30 min · proves you're a real person to Google & AdSense
📋 Step-by-Step Guide — Writing Your About Page
⚠️ Why does this matter? Google's quality raters are actual humans who look at websites before ranking them. They check: Is this a real website by a real person? Your About page is the answer. AdSense reviewers also look here to verify legitimacy.
  1. 1
    Create a new page in your React app at the route /about. This URL is already in your sitemap.
  2. 2
    Write these 4 sections (copy this structure):
    What is Documateo? — "A free online tool suite with 48+ PDF and image tools, no signup needed, no watermarks."
    Why I built it — Tell your real story. Why did you start this? What problem annoyed you?
    What makes us different — "Built in India, privacy-first, completely free for daily use."
    Contact — Add your email address. Real contact info builds E-E-A-T trust.
  3. 3
    Aim for 200-300 words minimum. Don't worry about it being perfect — authentic is better than polished.
  4. 4
    Add a footer link to /about on every page. Google's E-E-A-T (Experience, Expertise, Authoritativeness, Trust) score improves when you do this.
💡 "E-E-A-T" is Google's way of deciding if a website is trustworthy. An About page with a real person's story dramatically improves your chances of ranking AND getting AdSense approved.
▼ Show Steps
Add noindex tags to private pages
HIGH 15 min · prevents private pages appearing in Google
📋 Step-by-Step Guide — Hiding Private Pages from Google
⚠️ Why does this matter? Pages like /login and /dashboard shouldn't appear in Google search results. If they do, it looks unprofessional and wastes Google's crawl budget on pages that have no value to searchers.
  1. 1
    In your React app, for each private route, add this HTML tag inside the <head> section:
    <meta name="robots" content="noindex, nofollow">
  2. 2
    Add this tag to these pages: /login, /register, /dashboard, /billing, /admin, /security.
  3. 3
    If you're using React Helmet or a meta management library, add it there. If you're managing meta tags directly in the component, add it to the component's head section.
  4. 4
    Also remove /security and /login from your sitemap.xml file entirely — private pages should never be in the sitemap.
  5. 5
    Redeploy your site. Go to GSC → URL Inspection → test one of those private URLs → confirm it says "noindex".
💡 Google has a limited "crawl budget" for your site — it can only visit a certain number of pages per day. Wasting it on login pages means your tool pages get crawled less. noindex = protect your crawl budget.
▼ Show Steps
Install Microsoft Clarity (free heatmaps + session recordings)
HIGH 15 min · 100% FREE forever · shows exactly where users click
📋 Step-by-Step Guide — Setting Up Microsoft Clarity
⚠️ What is Clarity? It's a free tool by Microsoft that records your users' screen as they use your website. You can watch videos of real users using your tools — where they click, where they get confused, where they leave. Completely free, no limits.
  1. 1
    Go to clarity.microsoft.com — click "Get Started for Free". Sign in with any Microsoft account (Outlook, Hotmail, etc.).
  2. 2
    Click "Add new project". Enter: Project name = Documateo | Website URL = https://documateo.com. Click Continue.
  3. 3
    Clarity will give you a small JavaScript snippet (looks like: <script>...</script>). Copy it.
  4. 4
    Paste this snippet inside the <head> tag of your website. Since you have a React app, add it to your index.html file in the public folder.
  5. 5
    Deploy your site. Go back to Clarity — it will say "Waiting for data". Within a few hours of getting real visitors, it starts recording.
  6. 6
    After 3 days: Come back and watch 5 session recordings. Look for: where do users get confused? Where do they click that doesn't work? Where do they leave?
  7. 7
    Check Heatmaps for your most popular pages: /pdf/merge, /pdf/compress, /image/remove-bg. Dark red = lots of clicks, blue = ignored areas.
💡 Clarity shows you exactly where users "rage-click" (click multiple times in frustration) — that tells you exactly what to fix. It also shows which parts of the page users actually scroll to, so you know where to place ads.
▼ Show Steps
Apply for Google AdSense
HIGH 15 min to apply · 7-14 days to get approval
📋 Step-by-Step Guide — Applying for Google AdSense
⚠️ Apply AFTER creating your Privacy Policy and About pages. Without those, you'll be rejected immediately. Also make sure your site has real content (your 90 blog posts and 48 tools already qualify). There is NO minimum traffic requirement.
  1. 1
    Go to adsense.google.com — click "Get Started". Sign in with a Google account (use the same one you use for GSC for easier management).
  2. 2
    Enter your website URL: https://documateo.com. Select Country: India. Select Currency: INR. Click Save and Continue.
  3. 3
    You'll be given a verification snippet — a small piece of JavaScript code. Copy it.
  4. 4
    Paste this snippet into the <head> tag of your index.html (in the public folder). Deploy your site. This lets Google verify you own the website.
  5. 5
    Important: Do NOT create ad slots yet. Just the verification snippet is enough. Wait for the approval email.
  6. 6
    Wait 7-14 days. Google will either: ✅ Approve you (you get an email) or ❌ Reject you with a specific reason. If rejected, read the email carefully — it tells you exactly what to fix. Common reasons: missing Privacy Policy, thin content, confusing navigation.
💡 AdSense doesn't require minimum traffic. They care about: 1) Real content (you have 90+ blog posts ✅), 2) Privacy Policy page ✅ (after you create it), 3) About page ✅, 4) No policy violations (no copyright content, no misleading claims). You already qualify!
▼ Show Steps
You have 48 tools and 90+ blog posts. The work now is: technical fixes, monetization setup, and building the daily habits that make SEO compound. Think of it like planting seeds — you won't see the harvest in week 1, but by month 3 you'll have daily organic visitors arriving without any effort.
Month 1 — Technical Foundation Most Critical
SEO Technical Fixes
Fix React SPA rendering — Cloudflare Pages Function
DONE ✅ All 48 tools + 90 blogs now visible to Google
Fix Googlebot 403 — crawler whitelist in FastAPI middleware
DONE ✅ Googlebot no longer blocked
Request indexing for all 102 pages (10/day over 10 days)
CRITICAL ~10 days total · highest impact action
📋 Complete Guide — Getting All 102 Pages Indexed
⚠️ Why is this critical? A page can't rank in Google if it's not indexed first. "Indexed" means Google has read your page and saved it in their database. You have 102 pages but Google may only know about 34. You need to tell Google about the other 68 pages.
  1. 1
    Every morning, go to search.google.com/search-console → URL Inspection → paste 10 URLs → click "Request Indexing" for each.
  2. 2
    Day 1 (PDF Tools): /pdf/merge, /pdf/compress, /pdf/split, /pdf/protect, /pdf/unlock, /pdf/watermark, /pdf/pdf-to-word, /pdf/rotate, /pdf/flatten, /pdf/to-image
  3. 3
    Day 2 (Image Tools): /image/remove-bg, /image/compress, /image/resize, /image/crop, /image/convert, /image/watermark, /image/remove-exif, /image/bulk-resize, /image/flip, /image/aspect-crop
  4. 4
    Day 3 (Video + More PDF): /video/extract-audio, /video/video-to-gif, /pdf/redact, /pdf/delete-pages, /pdf/rearrange, /pdf/page-number, /pdf/add-text, /pdf/stamp, /pdf/extract, /pdf/remove-metadata
  5. 5
    Days 4-10: Submit blog posts, 10 per day. Priority blogs: comparison articles ("Documateo vs ilovepdf"), "Best free PDF tools India 2026", and all "how to" guides.
  6. 6
    Track which ones are indexed: Go to GSC → Coverage → "Valid" tab to see indexed pages. Update the GSC Indexing panel in this dashboard.
💡 Set a daily reminder at 9am: "Submit 10 URLs to GSC". It takes 5 minutes per day and the payoff is massive — each indexed page is another entry point for organic traffic.
▼ Show Full Guide
Fix sitemap duplicate URLs (3 exact duplicates found)
HIGH Confuses Google about which page to rank
📋 Step-by-Step Guide — Fixing Duplicate Sitemap URLs
⚠️ What's the problem? Your sitemap.xml has some URLs listed twice. When Google sees the same URL twice, it gets confused about which version to index. It can also split the "ranking power" between duplicates, hurting both pages.
  1. 1
    Open your sitemap.xml file in your code editor (it's usually in the public folder or generated by your sitemap library).
  2. 2
    Use Ctrl+F (Find) to search for: how-to-remove-pdf-metadata — delete one of the duplicate entries.
  3. 3
    Search for: how-to-convert-video-to-gif — delete one of the duplicate entries.
  4. 4
    Find and completely remove: /security and /login from the sitemap. These are private pages and should never be in the sitemap.
  5. 5
    Save the file and redeploy your site. Then resubmit the sitemap in GSC (Sitemaps → Resubmit).
💡 A clean sitemap with no duplicates = Google trusts your site more = faster and better indexing. 5 minutes of cleanup = months of better SEO performance.
▼ Show Steps
Add noindex to private pages (/login, /dashboard, /register, /billing, /admin)
HIGH 15 min · protects crawl budget
Add internal linking between tools (reverse-tool loop)
HIGH ilovepdf's #1 retention trick · 5+ pages/session
📋 Step-by-Step Guide — Building the Tool Loop
⚠️ What is a "tool loop"? ilovepdf shows you a "Next step" suggestion after every tool result. After you compress a PDF, it says "Now merge your PDFs?" After you merge, it says "Want to compress the merged file?" Users keep clicking and stay on the site 5+ pages per visit. This is their #1 retention strategy.
  1. 1
    After PDF Compress result page → add a link: "Now merge your PDFs? → PDF Merge →"
  2. 2
    After PDF Merge result → add: "Need to compress the merged file? → PDF Compress"
  3. 3
    After Image Remove BG result → add: "Now resize your image? → Image Resize"
  4. 4
    After PDF to Word result → add: "Need to convert back? → Word to PDF"
  5. 5
    Every tool should link to 2-3 related tools. Think about what someone naturally does next after using each tool.
  6. 6
    Style them as clean button-like links below the download button. Don't make them look like ads — make them look like helpful suggestions.
💡 Each internal link also passes "SEO authority" between pages — it tells Google that your pages are related and important. ilovepdf has been doing this for years and it's one of the main reasons they dominate search results.
▼ Show Strategy
Monetization Setup (Month 1)
Create Privacy Policy + Terms of Service pages
CRITICAL AdSense requirement · see "Do Today" for full guide
Apply for Google AdSense
CRITICAL No traffic minimum · see "Do Today" for full guide
Sign up for Adobe Acrobat affiliate (Impact.com) — ₹600–₹2,500/sale
HIGH 2–5 days approval · passive income on PDF pages
📋 Step-by-Step Guide — Setting Up Adobe Affiliate
⚠️ What is affiliate marketing? You add a special link on your website. When someone clicks it and buys Adobe Acrobat, Adobe pays you a commission (₹600–₹2,500 per sale). You don't handle the product, shipping, or customer service. You just add a link.
  1. 1
    Go to impact.com → Click "Join as a Partner" → Create a Publisher account (you're a publisher — the website owner who promotes products).
  2. 2
    Fill in your details: Website URL = documateo.com, Category = Software/Technology, Monthly visitors = your current number (estimate is fine).
  3. 3
    Once your account is created, use the search bar inside Impact to search "Adobe" → Find "Adobe Acrobat" in the marketplace → Click "Apply".
  4. 4
    Wait 2-5 days for Adobe to approve your application. They look at whether your site is relevant to their product (PDF tools = very relevant ✅).
  5. 5
    Once approved, go back to Impact → Adobe program → get your unique affiliate link. It looks like a normal URL but has a tracking code in it.
  6. 6
    Place the link on your PDF tool pages: Add a small text at the bottom of every PDF tool page: "Need professional PDF editing? Try Adobe Acrobat →"
  7. 7
    Add to PDF blog posts naturally — contextual mentions convert 10× better than banners. Add a "Tools We Recommend" box at the end of each blog post.
  8. 8
    Add a disclosure at the top of every page with affiliate links: "This page contains affiliate links. If you buy through our links, we may earn a commission at no extra cost to you."
💡 You only need ONE person per month to buy Adobe through your link to earn ₹2,500. With 15,000+ monthly visitors on PDF pages, this is extremely achievable. Contextual links (in-text) convert 10-15× better than banner ads.
▼ Show Full Setup Guide
Sign up for Canva Pro affiliate (Image tools) — ₹500–₹1,800/sale
HIGH 1–3 days approval · great fit for image tool pages
📋 Step-by-Step Guide — Setting Up Canva Affiliate
  1. 1
    Go to canva.com/affiliates → Click "Apply Now". Fill in your website details.
  2. 2
    Description tip: Write "I run Documateo.com, a free image and PDF tool website. My users often need design tools after processing their images."
  3. 3
    Wait 1-3 days for approval. Once approved, get your affiliate link from the Canva affiliate dashboard.
  4. 4
    Place it on your Image tool result pages: After Remove Background, Resize, Compress — add: "Want to design with your image? Try Canva Pro →"
  5. 5
    Add to image-related blog posts: "Best image tools India 2026", "How to compress images", etc.
💡 Canva has a massive brand recognition in India — your users already know and trust Canva. Mentioning it feels like a helpful suggestion, not a sales pitch. That's why conversion rates are high.
▼ Show Steps
Add affiliate links to all 90+ blog posts (batch in one session)
MEDIUM 4–5 hrs · passive income forever after
📋 Strategy Guide — Adding Affiliate Links to Blog Posts
  1. 1
    Block out one 5-hour session to do all blog posts at once. Put on music, make tea, don't get distracted.
  2. 2
    Do all PDF blog posts first → add Adobe Acrobat affiliate link. Then all image blog posts → add Canva Pro affiliate link.
  3. 3
    Maximum 2 affiliate links per post — one naturally in the article body, one in a "Tools We Recommend" box at the very end.
  4. 4
    Never write "click here" — instead write the full product name: "Try Adobe Acrobat for professional PDF editing". Descriptive links convert much better.
  5. 5
    Add a short disclosure at the top of every blog post: "Disclosure: This post contains affiliate links. We may earn a small commission if you buy through our links, at no extra cost to you."
  6. 6
    After finishing, test a few links to make sure they work and your tracking code is in them.
💡 This is a "plant once, harvest forever" task. Spend 5 hours today, earn passive affiliate income every month for years without touching those posts again.
▼ Show Strategy
Month 2 — Traffic & Content Growth Phase
Place AdSense ads strategically once approved
HIGH Do AFTER approval email arrives
📋 Guide — Placing AdSense Ads for Maximum Revenue
⚠️ Don't do this until you receive the approval email. Placing ad code before approval can get your account banned permanently.
  1. 1
    Week 1-2 after approval: Enable "Auto Ads" only. Go to AdSense → Ads → Overview → toggle on "Auto Ads". Let Google's AI test placements automatically. This is the safest way to start.
  2. 2
    After 2 weeks, go to AdSense → Reports → see which pages and placements earn the most. Manually replicate those positions on high-traffic pages.
  3. 3
    Best ad positions for tool sites: Above the upload area (users see it while the page loads), below the download button (users see it while downloading), between paragraphs 2 and 5 of blog posts.
  4. 4
    Best ad sizes: 728×90 leaderboard (desktop), 300×250 rectangle (sidebar), 320×50 mobile banner.
  5. 5
    Never place ads: Inside drag-and-drop zones, as popups, or in a way that covers content. These are policy violations that can get you banned.
💡 Start with Auto Ads. Let Google do the testing for 2 weeks. You'll earn less at first, but you'll learn which placements actually work for your specific users. Then manually optimize based on real data.
▼ Show Ad Strategy
Set up email capture with Brevo (free — 300 emails/day)
MEDIUM 2 hrs setup · builds a direct audience you own
📋 Step-by-Step Guide — Building Your Email List with Brevo
⚠️ Why build an email list? Google can change its algorithm and your traffic can drop overnight. Your email list is the ONE asset no algorithm can take away. Even 500 engaged subscribers is more valuable than 10,000 anonymous visitors.
  1. 1
    Go to brevo.com → Sign up for free. Free plan includes: 300 emails/day, up to 1,000 contacts, email automation. No credit card needed.
  2. 2
    Go to Contacts → Create a new list called "Documateo Users".
  3. 3
    Go to Forms → Create a new form. Keep it simple: just Email field + "Email me my result" button. No name field needed — fewer fields = more sign-ups.
  4. 4
    Best capture moment: After a user processes a file, show: "Email this result to yourself? [email field] [Send]". This feels like a useful feature, not a signup form. Conversion rate is very high.
  5. 5
    In Brevo → Automations → Create a Welcome sequence:
    • Day 0: "Thanks for using Documateo! Here's your file + [link to your most popular tool]"
    • Day 3: "Pro tip: Did you know you can also [compress/merge/etc.]? [tool link]"
    • Day 7: "Documateo PRO removes ads and lets you process unlimited files for ₹199/month. [upgrade link]"
  6. 6
    Get the Brevo API key or use their form embed code to integrate with your React app.
💡 Logged-in users convert to PRO at 4× the rate of anonymous users. An email list also enables you to announce new features, which brings back repeat users.
▼ Show Setup Guide
Write 4 competitor-targeting blog posts (1 per week)
HIGH Targets frustrated ilovepdf/Smallpdf users actively searching for alternatives
📋 Guide — Writing Competitor Alternative Blog Posts
⚠️ Why target competitor keywords? People searching "ilovepdf alternative" are already looking for something better — they're the EASIEST traffic to convert because they already want to switch. This is the single most valuable content strategy for tool websites.
  1. 1
    Week 1: Write "Best Smallpdf Alternatives — Free in 2026". Structure: Why people leave Smallpdf (hourly limits, watermarks) → List of alternatives → Why Documateo is the best free option. Target keyword: "smallpdf alternative free".
  2. 2
    Week 2: Write "Best ilovepdf Alternative Without Ads". Structure: Why ilovepdf has ads → Alternatives → Documateo as the ad-light option. Target keyword: "ilovepdf alternative no ads".
  3. 3
    Week 3: Write "Best Free PDF Tools in India 2026". India-specific search, very low competition. Include: tool comparison table, pricing, ease of use for Indian users.
  4. 4
    Week 4: Write "How to Compress PDF on Mobile (Free)". Mobile-specific, underserved keyword. Focus on: using Documateo on phone, Android/iOS tips.
  5. 5
    Blog post structure for best results: H1 title (keyword) → Introduction (problem) → Comparison table → Detailed review of each option → CTA to use Documateo → FAQ section (use real Google questions). Aim for 1,500+ words.
💡 You can write each post in 2-3 hours. Use ChatGPT to generate a first draft, then edit it to add real insights and your personal voice. AI content + human editing = fast content production.
▼ Show Content Strategy
Implement PRO upgrade friction-point triggers in the app
HIGH 3–4 hrs dev · biggest PRO conversion driver
📋 Developer Guide — Implementing PRO Upgrade Triggers
⚠️ Key principle: NEVER block the free tool. Let free users complete their task. The upgrade prompt is a helpful suggestion, not a wall. Blocking access = users leaving forever. Gentle suggestions = conversions.
  1. 1
    Trigger 1 — File size limit: If uploaded file > 10MB, show a non-blocking banner: "Your file is 15MB. We'll process it, but PRO users get unlimited file sizes. [Upgrade for ₹199/month]". Still process the file.
  2. 2
    Trigger 2 — 3rd tool use today: Track tool usage in localStorage. When a user opens their 3rd tool in one day, show a gentle banner at top: "You're really putting Documateo to work today! 💪 PRO removes limits and ads. [Try free for 7 days]".
  3. 3
    Trigger 3 — Batch upload attempt: If user tries to upload 4+ files and they're on free plan: "Batch processing is a PRO feature — ₹199/month. [Try PRO free for 7 days]". Block this one.
  4. 4
    Trigger 4 — After high-value tool use: After Remove BG or PDF to Word result, show: "Liked this? PRO = unlimited uses + no ads + batch processing. Starting at ₹199/month. [Start free trial]".
  5. 5
    7-day free trial setup in Razorpay: Go to Razorpay dashboard → Subscriptions → Plans → Edit your plan → Enable Trial Period → set 7 days. This alone gives 3-5× conversion rate increase.
💡 The best SaaS companies show upgrade prompts at moments of HIGH engagement (when users clearly find value) not at moments of FRUSTRATION. "You just removed the background from 3 images! PRO lets you do 100/day" converts better than "You've hit your limit".
▼ Show Implementation Guide
Write 2 Hindi blog posts for top tools
MEDIUM Zero competition · massive untapped audience
📋 Guide — Hindi Blog Strategy (India-First Advantage)
⚠️ Why Hindi? Millions of Indians search Google in Hindi. ilovepdf and Smallpdf have ZERO Hindi content. You could rank #1 for popular Hindi searches with almost zero effort because no competitor is targeting these keywords.
  1. 1
    Post 1: "PDF compress kaise kare free mein" (How to compress PDF for free). Write a simple, clear guide in Hindi. Use Documateo as the recommended tool throughout.
  2. 2
    Post 2: "PDF merge karna sikhe free mein" (Learn to merge PDF for free). Same format.
  3. 3
    Writing in Hindi: If your Hindi is not strong, use Google Translate on your English posts + manual editing for natural-sounding language. Or use ChatGPT: "Write this blog post in simple, clear Hindi".
  4. 4
    Use Hindi keywords naturally in the H1 and first paragraph. Google understands Hindi very well.
  5. 5
    After publishing, request indexing for these URLs in GSC.
💡 There are 500+ million Hindi internet users in India. A single Hindi article that ranks #1 for a popular search can bring thousands of visitors per month. Competition is near-zero because all your competitors are English-only Western companies.
▼ Show Hindi Strategy
Month 3 — Scale & Consolidate Milestone Month
Apply for Ezoic when GA4 hits 10,000 sessions/month
HIGH 2–3× RPM vs AdSense · biggest near-term revenue unlock
📋 Guide — Upgrading from AdSense to Ezoic
⚠️ What is Ezoic? It's an ad network that uses AI to test thousands of different ad placements and sizes to maximize your revenue. Most websites see 2-3× more revenue per visitor compared to AdSense alone. Minimum requirement: 10,000 sessions/month.
  1. 1
    Set a weekly Monday reminder to check GA4: Home → Users → Sessions this month. When you see 10,000+ sessions in any single month → apply immediately.
  2. 2
    Go to ezoic.com → Apply as publisher → Enter your website URL → Connect your Google Analytics → Submit.
  3. 3
    Ezoic integration: They'll ask you to add their script to your site. This takes about 30 minutes. Their support team helps you through the process.
  4. 4
    Ezoic's AI will automatically start testing different ad configurations. Give it 2-4 weeks to learn your site's patterns. Revenue will improve each week.
💡 At 10,000 sessions with AdSense: ~₹3,000-5,000/month. Same 10,000 sessions with Ezoic: ~₹7,000-12,000/month. Same traffic, 2-3× more money. This is the most impactful single action you'll take in Month 3.
▼ Show Guide
Launch Developer API with API key auth
MEDIUM Developers churn rarely · most reliable revenue stream
Ship 10 new tools from Phase 1 & 2 of roadmap
MEDIUM Each new tool = new SEO page = new entry point for visitors
Join CJ Affiliate for Notion + Grammarly links
MEDIUM cj.com · productivity tool affiliate
📋 Guide — CJ Affiliate for Productivity Tools
  1. 1
    Go to cj.com (Commission Junction) → Sign up as a publisher → Enter documateo.com as your website.
  2. 2
    Search for "Notion" and "Grammarly" in the advertiser marketplace → Apply to each program.
  3. 3
    Where to place Grammarly links: On your PDF to Word conversion page — after converting, mention "Clean up grammar in your Word doc with Grammarly".
  4. 4
    Where to place Notion links: On your blog about document workflows — "Organize your documents better with Notion".
💡 Grammarly pays up to ₹1,500 per free sign-up, not just paid conversions. It's one of the highest-paying affiliate programs per action.
▼ Show Guide
Month 4–6 Milestones
Month 4
15,000–30,000 Monthly Visitors
AdSense + Ezoic running. Affiliate income from Adobe + Canva established. First PRO subscribers. Revenue: ₹9,500–₹27,000/month.
Month 5
30,000–60,000 Monthly Visitors
Apply for Mediavine if sessions hit 50,000. Developer API launched. 60+ tools live. Revenue: ₹21,000–₹51,000/month.
Month 6
60,000–1,20,000 Monthly Visitors
Multiple affiliate programs running. PRO subscriptions stable. Hindi content driving significant India traffic. Revenue: ₹46,000–₹1,23,000/month.
Month 4-6 Key Tasks
Apply for Mediavine at 50,000 sessions/month
HIGH ₹400–₹800 RPM · premium ad network
Build Chrome Extension — right-click PDF & image tools
HIGH ilovepdf's moat · 2-3 week build
Rank in top 10 for "ilovepdf alternative" and "smallpdf alternative"
HIGH Highest-intent traffic possible
Launch Tool Pipeline feature — chain multiple tools in one flow
MEDIUM #1 PRO conversion feature
Ship full video suite (Trim, Mute, Rotate, Speed, Merge)
MEDIUM ffmpeg — 2 Dockerfile lines
Reach 85+ total tools live
MEDIUM Each tool = new SEO page
Monthly Visitors
1.2L+
Organic SEO compound growth
Monthly Revenue
₹1.5L
Ads + Affiliate + PRO subs
Tools Live
85+
Complete Phase 1-3 roadmap
Chrome Extension
10k
Users · Long-term moat
Month 7–9 Priorities
Build Chrome Extension — PDF & Image tools in browser
HIGH 2–3 week build · compounds forever
📋 Guide — Building the Documateo Chrome Extension
⚠️ Why a Chrome Extension? ilovepdf's Chrome extension + WordPress plugin = 2 million backlinks from 26,000 different websites. Every user who installs your extension promotes your brand every time they use Chrome. It's a compounding marketing machine.
  1. 1
    Core feature: Right-click any image on any webpage → "Open in Documateo" → Compress, Remove BG, Resize. No download needed.
  2. 2
    Core feature: Right-click any PDF link → "Process with Documateo" → Merge, Compress, Convert.
  3. 3
    Core feature: Extension popup — quick tool launcher with your last 5 operations shown. One-click access to any tool.
  4. 4
    Publish to Chrome Web Store: One-time $5 developer fee. Review takes 1-3 days. Make a compelling store listing with screenshots.
  5. 5
    Promote on ProductHunt, Reddit r/Chrome, tech Twitter. A Chrome Extension launch on ProductHunt can bring thousands of visitors overnight.
💡 The Chrome Extension is the #1 long-term moat you can build. Once users install it, Documateo becomes part of their daily browser. Uninstall rate is very low. And it generates backlinks automatically as other sites mention it.
▼ Show Guide
Apply for Mediavine at 50,000 sessions/month
HIGH ₹400–₹800 RPM
Ship full video suite (Trim, Mute, Rotate, Speed Change, Merge)
MEDIUM ffmpeg — 2 Dockerfile lines
Launch Tool Pipeline / Chain feature (PRO)
MEDIUM Compress → Watermark → Protect in one flow
Build WordPress plugin (like ilovepdf's backlink machine)
MEDIUM Long-term backlink engine · free to publish
Month 10–12 Priorities
Launch Free API tier (developer acquisition + backlinks)
MEDIUM ilovepdf's API = 26k backlinks
Target enterprise / B2B customers with Team plan
MEDIUM ₹999/month/user · very low churn
Rank top 10 for "ilovepdf alternative" and "smallpdf alternative"
HIGH Searchers are ready to switch
Reach 85+ tools — complete Phase 1-3 roadmap
MEDIUM
⛔ What NOT to Build Yet
OCR (Image to Text)
Tesseract on Railway is 10–30s per page. Will generate timeouts and 1-star reviews. Build when: Celery/Redis job queue is added. Currently the user experience would be terrible.
💸
AI-Powered Tools (OpenAI / Claude API)
Costs ₹2–5 per operation. Unsustainable until PRO revenue is stable at ₹50k+/month. Build when: PRO revenue comfortably covers API call costs.
🐢
Office File Conversion (LibreOffice)
+800MB Docker image. Crash-prone. Slow. PyMuPDF already handles most conversion cases. Build when: Dedicated processing worker instance.
🧠
Video Transcription / Subtitles (Whisper)
Whisper model is 1.5GB+. Will crash Railway free tier instantly (OOM error). Build when: Dedicated GPU worker or paid API like AssemblyAI.
🔄
Async Job Queue (Celery + Redis)
Significant operational complexity. Premature at current scale. Build when: Video compression jobs start timing out regularly (you'll know when).
💡 How Documateo Makes Money (Overview for Beginners)
Your website earns money in 3 ways simultaneously:
1
Display Ads (Google AdSense): Google shows ads on your pages. You earn every time someone views or clicks them. Passive — no work needed after setup. Earns: ₹50–₹200 per 1,000 visitors.
2
Affiliate Links: You recommend products (Adobe Acrobat, Canva Pro). When users buy through your link, you get a commission. One-time work, permanent passive income. Earns: ₹500–₹2,500 per sale.
3
PRO Subscriptions: Users pay ₹199/month for unlimited access, no ads, batch processing. Direct revenue. Earns: ₹199/month per subscriber, recurring forever.
Step 1 — Google AdSense Setup
Create Privacy Policy page at /privacy-policy
CRITICAL Required for AdSense · 20 min · see "Do Today" for full guide
Create Terms of Service page at /terms-of-service
CRITICAL Same generator as Privacy Policy · 5 min
📋 Quick Guide — Terms of Service
  1. 1
    Go to termsofservicegenerator.net or use the same privacypolicygenerator.info site — it also generates Terms of Service.
  2. 2
    Enter: Website name = Documateo, URL = https://documateo.com.
  3. 3
    Copy the generated text → create page at /terms-of-service → add footer link.
▼ Show Steps
Write About page (200+ words, founder story)
CRITICAL30 min · full guide in "Do Today"
Apply for Google AdSense
CRITICALadsense.google.com · 15 min · full guide in "Do Today"
Enable Auto Ads once approved by AdSense
HIGHDo immediately after approval email arrives
📋 Guide — Enabling Auto Ads
  1. 1
    Go to adsense.google.com → click "Ads" in the left sidebar → click "Overview".
  2. 2
    You'll see an "Auto ads" toggle — turn it ON.
  3. 3
    Make sure the AdSense code snippet (from when you applied) is still on every page of your site. Auto Ads uses this same code to show ads.
  4. 4
    Within 30-60 minutes, ads will start appearing automatically on your site. Google's AI decides the best placements.
  5. 5
    After 2 weeks, check "Reports" to see which pages and placements earn the most, then manually optimize those spots.
💡 Start with Auto Ads. Let Google's AI learn your site for 2-4 weeks before manually placing ad units. This gives you a baseline to compare against.
▼ Show Steps
Install Microsoft Clarity for heatmaps (shows where users actually look)
HIGHclarity.microsoft.com · FREE · 15 min · full guide in "Do Today"
Step 2 — Affiliate Income
Sign up: Adobe Acrobat affiliate (Impact.com) — ₹600–₹2,500/sale
HIGH30 min · 2–5 days approval · full guide in 90-Day section
Sign up: Canva Pro affiliate — ₹500–₹1,800/sale
HIGHcanva.com/affiliates · 1–3 days approval · full guide in 90-Day section
Add affiliate links to all 90+ blog posts
MEDIUM4–5 hrs · passive forever · full guide in 90-Day section
Join CJ Affiliate (cj.com) for Notion + Grammarly links
MEDIUMGrammarly pays per free signup, not just paid
Add "Tools We Recommend" section to every blog post
MEDIUMConverts 5-10× better than sidebar banners
📋 Guide — Creating the "Tools We Recommend" Box
  1. 1
    At the very end of every blog post (after conclusion, before comments), add a styled box titled "🛠️ Tools We Recommend".
  2. 2
    For PDF posts: List 1-2 affiliate products + link to relevant Documateo tools. Example: "Adobe Acrobat [affiliate link] | Documateo PDF Compress [internal link]".
  3. 3
    Make it look like a genuine recommendation, not an ad. Use a light-colored box with icons. Readers who reach the end of a blog post are engaged — they convert.
  4. 4
    Create this as a reusable React component so you can add it to any blog post with one line of code. Pass the affiliate category (pdf/image/video) as a prop and it automatically shows the right recommendations.
▼ Show Guide
Step 3 — PRO Subscriptions (₹199/month)
Implement file size limit trigger (free: 10MB → PRO: unlimited)
HIGHHighest converting upgrade trigger for tool sites
📋 Guide — File Size Limit Implementation
⚠️ Important: Process the file anyway. Show the suggestion as a friendly banner, not a block. Blocking = user leaves forever. Suggesting = user considers upgrading.
  1. 1
    In your file upload handler (frontend), check the file size before uploading: if (file.size > 10 * 1024 * 1024) — this checks if file is over 10MB.
  2. 2
    If over 10MB AND user is not PRO: Show a banner at top of page: "📁 Your file is [X]MB. We're processing it! PRO users get unlimited file sizes, no ads, and batch processing for ₹199/month. [Try PRO free for 7 days]".
  3. 3
    Still upload and process the file. The suggestion is helpful, not a barrier.
  4. 4
    Track the conversion: How many users who see this banner click the PRO link? Use GA4 events to measure.
▼ Show Guide
Implement 3rd-tool-use-today non-blocking banner
HIGHHigh intent moment — user is clearly engaged
Block batch upload for free users with PRO prompt
HIGHBatch = power user = high PRO conversion intent
Add post-download PRO suggestion for Remove BG + PDF to Word
MEDIUM"Liked this? PRO = unlimited + no ads"
Enable 7-day free trial in Razorpay (3–5× conversion boost)
MEDIUMRazorpay → Subscriptions → Plan Settings → Trial Period = 7 days
📋 Guide — Setting Up the 7-Day Free Trial
⚠️ Why does a free trial matter so much? "Try PRO free for 7 days" converts 3-5× better than "Upgrade for ₹199/month". Users feel less risk. Most who try PRO don't cancel — they experience the value and keep paying.
  1. 1
    Log into your Razorpay dashboard → Click "Subscriptions" in the left sidebar.
  2. 2
    Find your existing subscription plan → Click "Edit Plan".
  3. 3
    Look for "Trial Period" setting → Enter: 7 days. Save changes.
  4. 4
    Update all your upgrade prompts to say: "Try PRO FREE for 7 days → Then ₹199/month".
  5. 5
    You do not charge users during the trial. After 7 days, Razorpay automatically charges them if they don't cancel. Most don't cancel.
▼ Show Guide
Step 4 — Email List (Your Most Valuable Asset)
Set up Brevo account (free — 300 emails/day, 1,000 contacts)
MEDIUMbrevo.com · full guide in 90-Day section
Add "Email your result" capture after file processing
MEDIUMFeels like a feature, not a form · high conversion rate
Build 3-email welcome sequence in Brevo
MEDIUMDay 0 welcome → Day 3 tip → Day 7 PRO offer
Add "Save file history — create free account" capture flow
MEDIUMConverts anonymous users into registered users
Technical SEO is fixed. Google can read all 48 tools + 90 blogs. Breadcrumbs and Review Snippets already showing in GSC. Now focus on content quality and internal linking — these are the only two things that drive ranking improvements from here.
🔍 How SEO Works (Explained for Beginners)
SEO (Search Engine Optimization) means making your website appear higher in Google search results. When someone types "compress PDF free" into Google, you want your website to appear on page 1. Here's how Google decides rankings:
1
Indexing: Google first needs to read and save your page. Without being indexed, you can't rank. (You're fixing this now with GSC requests.)
2
Relevance: Does your page content match what the user searched for? Your title, headings, and content should use the exact keyword the user searched.
3
Authority: Does Google trust your website? Trust comes from other websites linking to you (backlinks) and from having lots of quality content.
4
SEO is slow but compounding: Work you do today pays off in 3-6 months. But once you rank, you get free visitors every day without paying for ads.
Technical SEO — Week 1
Fix React SPA rendering — Cloudflare Pages Function
DONE ✅
Fix Googlebot 403 — FastAPI crawler whitelist
DONE ✅
Request indexing: 102 pages at 10/day in GSC
CRITICAL~10 days · full guide in "Do Today"
Fix sitemap: remove exact duplicates + /security + /login
HIGHFull guide in 90-Day section
Add noindex to private pages
HIGHFull guide in "Do Today"
Resubmit sitemap.xml in GSC after fixes
CRITICAL2 min · full guide in "Do Today"
Internal Linking — Month 1
Add reverse-tool links after every tool result
HIGHilovepdf's retention secret · full guide in 90-Day
Link each tool page to its corresponding blog post
HIGHBoosts blog post ranking via tool page authority
📋 Guide — Tool Page → Blog Post Linking
⚠️ What is internal linking? When one page on your website links to another page on your website. Google uses these links to understand which pages are related and which are important. More internal links to a page = Google thinks it's more important = better ranking.
  1. 1
    On your PDF Compress tool page → add a section: "📖 Learn more: How to Compress PDF Without Losing Quality →"
  2. 2
    On PDF Merge tool page → link to: /blog/how-to-merge-pdf-files-online-complete-guide
  3. 3
    On Image Remove BG tool → link to: blog posts about image editing, Canva alternatives, etc.
  4. 4
    Do this for every tool → link to its most relevant blog post. This is a one-time task that pays SEO dividends forever.
💡 Think of internal links as "votes of confidence" from one page to another. Your tool pages already get visitors — those visitors clicking to your blog posts tells Google "this blog post is worth reading".
▼ Show Guide
Link each blog post back to its tool page with a CTA button
HIGHConverts readers into users · boosts tool page ranking
📋 Guide — Blog Post → Tool CTA
  1. 1
    At the end of every blog post, add a prominent CTA (Call-to-Action) button: "🔧 Try Documateo's Free PDF Compressor →" linking to /pdf/compress.
  2. 2
    Also add a mid-article mention after you explain the process: "You can do this for free with Documateo's PDF Compressor."
  3. 3
    Style the CTA as a colored button — not just a text link. Colored buttons get 10× more clicks than text links.
  4. 4
    This converts organic blog readers into tool users who then might upgrade to PRO. The blog → tool → PRO funnel is your highest-value conversion path.
▼ Show Guide
Blog Content — Month 2–3
Write: "Best Smallpdf alternatives free 2026"
HIGHHigh intent competitor traffic · full guide in 90-Day Month 2
Write: "Best ilovepdf alternative no ads"
HIGHPeople actively looking to switch
Write: "Best free PDF tools India 2026" (low competition)
HIGHIndia-specific · low competition · high volume
Write: "PDF compress kaise kare" (Hindi — near-zero competition)
MEDIUM500M Hindi internet users · nobody targeting this
Write: "PDF merge karna free" (Hindi)
MEDIUMSame Hindi opportunity
Update top 10 blog posts: add H2 subheadings, FAQ section, word count 1,500+
MEDIUMImproving existing content ranks faster than creating new
📋 Guide — Improving Existing Blog Posts
⚠️ Why improve existing posts? Google ranks "comprehensive" content higher. A 500-word post rarely ranks for anything. A 1,500+ word post with clear sections and FAQs that covers a topic completely = much better chance of ranking page 1.
  1. 1
    Find your top 10 posts: Go to GSC → Performance → Pages → sort by Impressions (most views). These are the ones Google already knows about — improving them has the highest ROI.
  2. 2
    Open each post. Count the words. If under 1,200 words → expand with more details, step-by-step instructions, examples.
  3. 3
    Add H2 subheadings: Break the article into clear sections. Each H2 should answer a specific question. Google uses headings to understand what a page is about.
  4. 4
    Add FAQ section at the bottom: Find what people ask about your topic. Go to Google → search your keyword → scroll down to "People Also Ask". Add those questions as FAQs with short answers. This often gets you featured in Google's special "FAQ" snippets (shown above regular results).
  5. 5
    After editing, go to GSC → URL Inspection → request re-indexing for that URL. Google will re-read and potentially rank it higher.
▼ Show Guide
🔍 SEO Rankings Target — Top 10 Search Volumes
#Keyword / ToolMonthly SearchesCompetitionStatus
1PDF to Word2.1M
LowLive ✅
2Remove Background1.2M
LowLive ✅
3Video Compress800K
MediumBuild
4Extract Audio MP4→MP3700K
LowLive ✅
5PDF to Text600K
ZeroLive ✅
6Flatten PDF500K
ZeroLive ✅
7Video to GIF400K
LowLive ✅
8Video Trim380K
MediumBuild
9PDF Grayscale250K
ZeroBuild
10EXIF Remover450K
ZeroLive ✅
Already Live
14
PDF + Image + Video tools
Zero New Dependencies
14
Ship with existing libraries
One Library Needed
8
pip install only
Total Roadmap
47
Across 5 phases
🎯
Competitor gap analysis: iLovePDF has PDF Repair, Add Page Numbers, PDF Redact, PDF Annotate, OCR, e-Sign, and PDF Translate. Smallpdf has PDF Editor and eSign. These are the exact tools users search for after finding your basic tools — and they go to a competitor if you don't have them. Ship Phase 2 first — zero new dependencies, maximum traffic gain.
Phase 1 — Already Live Tick what you've shipped
PDF Compressor
LIVE pikepdf · your most-used tool · high search volume
PDF Merger
LIVE pikepdf · 1.8M searches/month globally
PDF Splitter
LIVE pikepdf · companion to merger
PDF Password Protect
LIVE pikepdf · strong PRO conversion
PDF Unlock / Remove Password
LIVE pikepdf · companion to protect
PDF Rotate Pages
LIVE pikepdf
PDF Watermark
LIVE reportlab · good PRO tool
Image Compressor
LIVE Pillow · 900K searches/month
Image Resize
LIVE Pillow · 500K searches/month
Image Format Converter (JPG / PNG / WebP)
LIVE Pillow · high demand from social media users
Image Crop
LIVE Pillow
Image Watermark
LIVE Pillow · PRO conversion
Extract Audio from Video — 700K searches/month
LIVE ffmpeg · already deployed · 30 min to build
📋 How it was built
  1. 1
    FastAPI endpoint runs: ffmpeg -i input.mp4 -vn -acodec mp3 output.mp3 on the uploaded file and returns the MP3 as a download.
  2. 2
    Also offer AAC: -acodec aac output.aac — better quality at smaller size than MP3.
  3. 3
    Companion idea: "Mute Video" (strip audio entirely): ffmpeg -i input.mp4 -an output.mp4 — add as a second quick tool.
▼ Reference Notes
Video to GIF — 400K searches/month (ffmpeg palette trick)
LIVE ffmpeg · two-step palette method = much better quality than direct conversion · viral sharing use case
📋 How it was built
  1. 1
    Two-step ffmpeg for best quality: Step 1 — generate a colour palette from the video: ffmpeg -i input.mp4 -vf "fps=10,scale=480:-1:flags=lanczos,palettegen" palette.png
  2. 2
    Step 2 — use the palette to create a high-quality GIF: ffmpeg -i input.mp4 -i palette.png -filter_complex "fps=10,scale=480:-1:flags=lanczos[x];[x][1:v]paletteuse" output.gif
  3. 3
    The palette method = 60–70% smaller file with much better colours vs direct conversion. Let user choose FPS (5/10/15) and max width (320/480/640px).
▼ Reference Notes
🚀 Phase 2 — Zero Dependency Wins Ship This Week · Existing Libraries Only · Zero Cost
⚙️ One-time Setup — Add ffmpeg + poppler-utils to Dockerfile (10 min total)
DO THIS FIRST One Dockerfile line unlocks 12+ video and PDF tools permanently. Zero cost. Zero new services.
📋 How to Do It — Dockerfile Setup
  1. 1
    Open your Dockerfile in your code editor. Find the line: apt-get install -y ghostscript imagemagick
  2. 2
    Change it to: apt-get install -y ghostscript imagemagick ffmpeg poppler-utils — just add those two packages at the end of that same line.
  3. 3
    Commit and push to GitHub. Railway will auto-rebuild and redeploy. Takes 3–5 minutes. That's it.
  4. 4
    ffmpeg = enables all video tools (compress, trim, watermark, mute, rotate). poppler-utils = enables PDF-to-image rendering. Both are free open-source packages, zero cost increase on Railway.
▼ How to Do It
PDF to Text — 600K searches/month (5 lines of code)
SHIP NOW PyMuPDF already installed · students, lawyers, researchers · build time: 45 min
📋 How to Build — PDF to Text
  1. 1
    Backend: import fitz; doc = fitz.open(file_path); text = "\n\n--- Page {i+1} ---\n".join([page.get_text() for i, page in enumerate(doc)])
  2. 2
    Return as downloadable .txt file via FastAPI FileResponse. Also add a "Copy to clipboard" button on the frontend for short PDFs.
  3. 3
    Handle scanned PDFs: if extracted text is fewer than 20 chars/page, show — "This looks like a scanned PDF. Use our OCR tool for best results." with a direct link to OCR.
  4. 4
    Total build time: ~45 minutes including frontend upload/download UI.
▼ How to Build
Flatten PDF — 500K searches/month (5 lines of pikepdf)
SHIP NOW pikepdf already installed · makes form fields permanently uneditable · every accountant and lawyer needs this
📋 How to Build — Flatten PDF
  1. 1
    What it does: Bakes all interactive form fields (checkboxes, text fields, signatures) into the page as static, uneditable content. Used by accountants, lawyers, and HR teams for official documents.
  2. 2
    Backend option A (pikepdf): import pikepdf; pdf = pikepdf.open(input_path); pdf.save(output_path, flatten_annotations=True)
  3. 3
    Backend option B (PyMuPDF — often better): import fitz; doc = fitz.open(path); doc.bake(); doc.save(output_path) — PyMuPDF's bake() flattens all annotations and widgets in one call.
  4. 4
    Frontend: show a bold warning — "⚠️ This action is permanent. The flattened PDF cannot be edited." Users need this before they proceed. Total build time: ~45 minutes.
▼ How to Build
Flip Image — Simple completion of suite (1 line)
HIGH Pillow · Image.FLIP_LEFT_RIGHT · missing from your image suite · ships in 20 minutes
📋 How to Build — Flip Image
  1. 1
    Horizontal flip (mirror): Image.open(path).transpose(Image.FLIP_LEFT_RIGHT).save(output)
  2. 2
    Vertical flip (upside down): Image.open(path).transpose(Image.FLIP_TOP_BOTTOM).save(output)
  3. 3
    Offer both on one page as two buttons. Show live preview after flip. Total build time: 20–30 minutes.
▼ How to Build
EXIF Remover — 450K searches/month (5 min to build)
SHIP NOW Pillow strips EXIF automatically on re-save · privacy tool · journalists, lawyers, anyone sharing photos online
📋 How to Build — EXIF Remover
  1. 1
    The trick: Pillow strips all EXIF metadata automatically when you re-save without the exif param: from PIL import Image; img = Image.open(path); img.save(output_path) — literally 2 lines.
  2. 2
    Show what was removed (key UX): Before saving, read EXIF: exif = img._getexif(). Map tag IDs to readable names. Show a summary: "GPS Location ✓ removed", "Camera: iPhone 15 ✓ removed", "Date taken: 12 Jan 2025 ✓ removed".
  3. 3
    If GPS data was present, highlight in orange: "⚠️ This image contained GPS coordinates revealing your exact location — permanently removed." This creates a viral "wow" moment users want to share.
  4. 4
    Total build time: ~45 minutes. The EXIF display UI takes longer than the actual removal.
▼ How to Build
Remove PDF Metadata — Privacy tool for journalists + lawyers
HIGH pikepdf: pdf.docinfo = {} · removes author, company, creation date, software info · easy PRO upsell
📋 How to Build — PDF Metadata Remover
  1. 1
    Read metadata first: import pikepdf; pdf = pikepdf.open(path); meta = dict(pdf.docinfo) — gives Author, Creator, Producer, CreationDate, ModDate, Company etc.
  2. 2
    Clear all metadata: pdf.docinfo = {}; pdf.save(output_path)
  3. 3
    Show before/after table on frontend: "Author: John Smith → Removed ✓", "Software: Microsoft Word 2019 → Removed ✓". Makes the tool feel powerful and worth bookmarking.
  4. 4
    Total build time: ~45 minutes.
▼ How to Build
Images to PDF — 1.1M searches/month
SHIP NOW Pillow already installed · one of the most searched tools globally · JPG/PNG/WebP → PDF
📋 How to Build — Images to PDF
  1. 1
    Backend: Accept multiple images: from PIL import Image; images = [Image.open(f).convert('RGB') for f in file_list]; images[0].save(output_path, save_all=True, append_images=images[1:])
  2. 2
    Frontend — drag to reorder: Show thumbnail previews after upload. Use @dnd-kit/sortable (free: npm install @dnd-kit/core @dnd-kit/sortable) for drag-and-drop page ordering before converting.
  3. 3
    Options: Page size (A4 default / Letter / Original image size). Margin (None / 5mm / 10mm).
  4. 4
    Free: up to 5 images. PRO: unlimited. Natural upgrade trigger for users combining 10+ scanned pages. Total build time: ~2 hours.
▼ How to Build
PDF to Image (JPG / PNG) — 800K searches/month
SHIP NOW PyMuPDF + Pillow already installed · each PDF page → image file · ZIP download for multi-page
📋 How to Build — PDF to Image
  1. 1
    Backend: import fitz; doc = fitz.open(pdf_path); pix = doc[0].get_pixmap(matrix=fitz.Matrix(2, 2)); pix.save(output_path) — Matrix(2,2) = 2× zoom = 144 DPI, high quality.
  2. 2
    Multi-page: convert all pages → zip them: import zipfile; with zipfile.ZipFile(zip_path, 'w') as zf: [zf.write(img, f"page-{i+1}.jpg") for i, img in enumerate(image_files)]
  3. 3
    Options: Format (JPG default / PNG for transparency), DPI (72 = screen, 150 = standard, 300 = print). Single page → image download. Multi-page → ZIP.
  4. 4
    Total build time: ~1.5 hours.
▼ How to Build
PDF Repair — 380K searches/month
HIGH pikepdf + PyMuPDF fallback · iLovePDF has this · you're missing it · desperate users = very high engagement
📋 How to Build — PDF Repair
  1. 1
    pikepdf opens corrupt PDFs tolerantly and re-saving fixes most corruption (bad cross-reference tables, invalid object streams): pdf = pikepdf.open(path, suppress_warnings=True); pdf.save(output_path)
  2. 2
    Wrap in try/except. If pikepdf fails, try PyMuPDF as fallback: doc = fitz.open(path); doc.save(output_path) — PyMuPDF is often more tolerant of severely damaged files.
  3. 3
    If both fail: return "This file is too severely damaged to repair automatically. It may have been truncated during download."
  4. 4
    Show file size before/after and: "Repair complete — recovered X pages." Total build time: ~1 hour.
▼ How to Build
Add Page Numbers to PDF — 290K searches/month
HIGH PyMuPDF already installed · iLovePDF has this · office workers need it constantly for reports + presentations
📋 How to Build — Add Page Numbers
  1. 1
    Backend: for i, page in enumerate(doc): w = page.rect.width; h = page.rect.height; page.insert_text((w/2 - 10, h - 20), str(i+1), fontsize=10, color=(0,0,0))
  2. 2
    Options to offer: Position (bottom-centre / bottom-right / bottom-left), Format ("1" / "Page 1" / "1 of 10"), Starting number (default: 1), Font size (8 / 10 / 12).
  3. 3
    Add "Skip first page" checkbox — useful for documents with a cover page. Total build time: ~1.5 hours including options UI.
▼ How to Build
Reorder / Rearrange PDF Pages — Drag and Drop
HIGH pikepdf · iLovePDF + Smallpdf both have this · drag-and-drop thumbnail UI · very high PRO conversion
📋 How to Build — PDF Page Reorder
  1. 1
    Backend: Accepts PDF + new page order array e.g. [2,0,1,3]: new_pdf = pikepdf.Pdf.new(); [new_pdf.pages.append(pdf.pages[i]) for i in new_order]; new_pdf.save(output)
  2. 2
    Frontend step 1: User uploads PDF → backend renders each page as small thumbnail (PyMuPDF at Matrix(0.5, 0.5)) → returns array of thumbnail URLs.
  3. 3
    Frontend step 2: Show thumbnails in grid. Use @dnd-kit/sortable (free) for drag-and-drop reordering. Show page number badge on each thumbnail.
  4. 4
    Add Delete (✕) button on each thumbnail — removes a page. This turns "reorder" into a full "page organiser" tool.
  5. 5
    When user clicks "Save", send new index array to backend. Total build time: ~4 hours — complex UI, but extremely high value and conversion.
▼ How to Build
Aspect Ratio Crop — 1:1, 16:9, 4:5 for social media creators
HIGH Pillow · social media creators need this daily for Instagram (1:1), YouTube thumbnails (16:9), Stories (9:16)
📋 How to Build — Aspect Ratio Crop
  1. 1
    Presets: Instagram Square (1:1), YouTube Thumbnail (16:9), Instagram Story / TikTok (9:16), Twitter/X Header (3:1), LinkedIn (1.91:1).
  2. 2
    Backend centre-crop logic: target = 16/9; r = w/h; if r > target: new_w = int(h * target); left = (w-new_w)//2; img = img.crop((left, 0, left+new_w, h))
  3. 3
    Show preview of each preset. Offer manual crop canvas as PRO feature. Total build time: ~2 hours.
▼ How to Build
PDF Crop (trim page margins) — iLovePDF has this
MEDIUM pikepdf crop box · removing white borders from scanned documents · popular with academics
📋 How to Build — PDF Crop
  1. 1
    pikepdf crop box: page = pdf.pages[0]; page.CropBox = pikepdf.Array([left, bottom, right, top]) — coordinates in PDF points (72 per inch).
  2. 2
    Presets: "Remove all white margins" (auto-detect content bounds), "Small 5mm", "Standard 10mm", "Custom".
  3. 3
    Auto-detect content: use PyMuPDF — bbox = page.get_bboxlog() to find where actual content is, then crop to that bounding box. Total build time: ~2 hours.
▼ How to Build
📦 Phase 3 — One pip Install Each Weeks 2–3 · Massive Traffic Gains
Remove Background — 1.2M searches/month (pip install rembg ~30MB)
HIGHEST TRAFFIC OPPORTUNITY CPU-only, works on Railway · your single biggest image tool · before/after slider UI
📋 How to Build — Background Remover
  1. 1
    Add to requirements.txt: rembg. ~30MB, CPU-only — no GPU needed, works on Railway free and paid plans.
  2. 2
    Backend: from rembg import remove; from PIL import Image; input_img = Image.open(file_path); output_img = remove(input_img); output_img.save(output_path, format='PNG') — always PNG (JPG can't store transparency).
  3. 3
    First run downloads AI model (~170MB) automatically. Cached on Railway after first deploy. Warn on first use: "First use may take 15 seconds while the AI model loads."
  4. 4
    Frontend — before/after slider: Use react-compare-slider (free npm) for a draggable divider showing original vs result. This dramatically increases perceived quality and social sharing.
  5. 5
    Add "Replace background colour" option — user picks a colour, fill transparent area before download. Essential for product photography use case. Total build time: ~3 hours.
▼ How to Build
Video Compressor — 800K searches/month (ffmpeg CRF encode)
HIGH ffmpeg already installed · CRF 28 = ~50% size reduction · CPU-heavy, test on Railway paid plan
📋 How to Build — Video Compressor
  1. 1
    ffmpeg command: ffmpeg -i input.mp4 -vcodec libx264 -crf 28 -preset fast output.mp4. CRF scale: 18 = high quality → 35 = smallest file. CRF 28 = good balance, ~50% reduction.
  2. 2
    Offer 3 preset buttons: Low (CRF 22), Medium (CRF 28, default), High (CRF 34). Show estimated output size next to each preset.
  3. 3
    Important: Video compression is CPU-intensive. A 100MB video takes 30–60 seconds. Use FastAPI BackgroundTasks for async processing and poll for completion every 2 seconds. Show a spinner with "Processing your video…".
  4. 4
    Free: max 50MB input. PRO: max 500MB. Strong natural upgrade trigger for video creators. Total build time: ~3 hours including async progress UI.
▼ How to Build
PDF to Word — 2.1M searches/month (single biggest SEO opportunity)
SINGLE BIGGEST SEO OPPORTUNITY #1 most searched PDF tool globally · iLovePDF + Smallpdf both have this · pdf2docx library
📋 How to Build — PDF to Word
  1. 1
    Add to requirements.txt: pdf2docx (handles layout, tables, and formatting far better than manual PyMuPDF extraction).
  2. 2
    Primary approach: from pdf2docx import Converter; cv = Converter(pdf_path); cv.convert(docx_path); cv.close()
  3. 3
    Fallback (if pdf2docx fails): PyMuPDF's .get_text('html') gets you 80% of the way — add python-docx to write the output as a proper .docx file. This is the #1 searched PDF tool globally.
  4. 4
    UX disclaimer on frontend: "Conversion quality depends on the PDF structure. Scanned PDFs need OCR first. Complex layouts may not convert perfectly." Prevents support complaints.
  5. 5
    Free: convert 1 page. PRO: full document. Total build time: ~2 hours.
▼ How to Build
Word to PDF — 1.5M searches/month
HIGH TRAFFIC Reverse of PDF to Word · equally high demand · LibreOffice headless via Dockerfile
📋 How to Build — Word to PDF
  1. 1
    Dockerfile: Add RUN apt-get install -y libreoffice. ~300MB but converts Word → PDF perfectly, better than any Python-only library.
  2. 2
    Backend: import subprocess; subprocess.run(['libreoffice', '--headless', '--convert-to', 'pdf', '--outdir', output_dir, input_path], check=True)
  3. 3
    LibreOffice also handles .pptx → PDF, .xlsx → PDF, .odt → PDF — one Dockerfile line enables 4 additional tools at no extra cost.
  4. 4
    Accept .docx, .doc, and .odt files. Total build time: ~1.5 hours including Dockerfile change and testing.
▼ How to Build
PDF to Excel — 900K searches/month
HIGH pdfplumber library · extracts tables from PDFs → .xlsx · finance + accounting = very high PRO conversion
📋 How to Build — PDF to Excel
  1. 1
    Add to requirements.txt: pdfplumber and openpyxl.
  2. 2
    Backend: import pdfplumber, openpyxl; wb = openpyxl.Workbook(); ws = wb.active; with pdfplumber.open(pdf_path) as pdf: [ws.append(row) for page in pdf.pages for table in page.extract_tables() for row in table]; wb.save(xlsx_path)
  3. 3
    Edge case: if no tables detected, fall back to plain text extraction written as single-column Excel. Tell user: "No tables detected — extracted as plain text."
  4. 4
    Primary use: bank statements, invoices, financial reports. Very high PRO conversion. Total build time: ~2 hours.
▼ How to Build
PDF to PowerPoint — 650K searches/month
HIGH python-pptx · each PDF page becomes a slide image · iLovePDF has this · office workers + students
📋 How to Build — PDF to PowerPoint
  1. 1
    Add to requirements.txt: python-pptx.
  2. 2
    Image-based approach (best quality): Convert each PDF page to high-res image (PyMuPDF Matrix(2,2)), insert as full-slide background: from pptx import Presentation; from pptx.util import Inches; prs = Presentation(); slide = prs.slides.add_slide(prs.slide_layouts[6]); slide.shapes.add_picture(img, 0, 0, width=prs.slide_width); prs.save(pptx_path)
  3. 3
    Set 16:9 dimensions: prs.slide_width = Inches(13.33); prs.slide_height = Inches(7.5). Slides look pixel-perfect — exactly what 90% of users need. Total build time: ~2 hours.
▼ How to Build
OCR — Scanned PDF to Searchable Text — 550K searches/month
HIGH pytesseract + tesseract-ocr · iLovePDF core feature · huge demand from scanned document users
📋 How to Build — OCR Tool
  1. 1
    Dockerfile: Add RUN apt-get install -y tesseract-ocr tesseract-ocr-eng tesseract-ocr-hin (eng = English, hin = Hindi — big win for Indian users).
  2. 2
    Add to requirements.txt: pytesseract.
  3. 3
    Process: Convert each PDF page to image (PyMuPDF) → run OCR: import pytesseract; text = pytesseract.image_to_string(Image.open(page_img), lang='eng') → compile all pages.
  4. 4
    Output options: plain .txt file, or embed text as invisible searchable layer back into the original PDF (best option — preserves scanned look but makes it searchable).
  5. 5
    Let user select language. Hindi OCR for Indian users has near-zero competition. Total build time: ~3 hours.
▼ How to Build
AI Image Upscaler — 400K searches/month
MEDIUM Real-ESRGAN model · strong PRO conversion · Canva charges premium for this · 2x/4x upscaling
📋 How to Build — AI Image Upscaler
  1. 1
    Add to requirements.txt: realesrgan. ~65MB model, CPU-compatible — no GPU needed on Railway.
  2. 2
    Backend: from realesrgan import RealESRGANer; import cv2; upsampler = RealESRGANer(scale=2, model_path='RealESRGAN_x2plus.pth'); output, _ = upsampler.enhance(cv2.imread(input_path)); cv2.imwrite(output_path, output)
  3. 3
    Free: 2× upscaling. PRO: 4× upscaling. Show before/after with zoom. CPU inference takes 10–30 seconds — always show a progress spinner. Total build time: ~3 hours.
▼ How to Build
💎 Phase 4 — PRO Conversion Features Weeks 4–6 · Revenue Drivers
Batch PDF Operations (Free: 3 files, PRO: unlimited)
BEST PRO TRIGGER IN ALL OF SAAS No new libraries needed · power users hit the 3-file wall and upgrade · most natural conversion point possible
📋 How to Build — Batch Processing
  1. 1
    On existing tool endpoints, check file count: if len(files) > 3 and not user.is_pro: raise HTTPException(403, "Batch processing beyond 3 files requires PRO")
  2. 2
    Process each file through existing single-file logic in a loop. Return all results as ZIP: import zipfile; with zipfile.ZipFile(zip_path, 'w') as zf: [zf.write(f) for f in output_files]
  3. 3
    Frontend: Change file input to accept multiple files (multiple attribute). Show file list with individual progress bars. Counter: "3/3 files (Free — Upgrade for more)" or "3/∞ (PRO)".
  4. 4
    Show upgrade banner immediately when free user selects their 4th file — don't wait for them to submit. Total build time: ~3 hours across all tools.
▼ How to Build
Tool History Dashboard (last 10 operations)
HIGH Store: tool_slug + original_filename + timestamp + result_file_url · drives account creation · Free: 3 days, PRO: 30 days
📋 How to Build — Tool History
  1. 1
    Your ToolUsage table already exists. Confirm columns: tool_slug, original_filename, output_filename, file_size_kb, status, created_at.
  2. 2
    In each tool endpoint, after success: db.add(ToolUsage(user_id=user.id, tool_slug="pdf-compress", original_filename=file.filename, status="success")); db.commit()
  3. 3
    Frontend: Add "Recent Activity" tab to user dashboard. Table: Date | Tool Used | File Name | Re-download (if file still exists within 24h).
  4. 4
    Free: last 3 operations, 3-day history. PRO: last 50 operations, 30-day history. The gap drives upgrades from power users who process many files daily. Total build time: ~3 hours.
▼ How to Build
Saved Presets (JSON in user_preferences table)
MEDIUM Let PRO users save "my compression setting", "my watermark style" · makes Documateo part of daily workflow · users can't leave without losing their settings
📋 How to Build — Saved Presets
  1. 1
    Add JSONB column: ALTER TABLE users ADD COLUMN preferences JSONB DEFAULT '{}';
  2. 2
    On each tool page, show "Save as preset" button (PRO only). Saves current settings: {"compression_quality": 75, "watermark_text": "DRAFT", "output_format": "pdf"} keyed by tool slug.
  3. 3
    When PRO user returns to the tool, auto-load preset and pre-fill all settings. Makes the tool feel personal and irreplaceable.
  4. 4
    Users with saved presets are far less likely to switch to a competitor — they'd lose their custom settings. This is a churn-reduction feature disguised as convenience. Total build time: ~2 hours.
▼ How to Build
Video Trim — 350K searches/month
HIGH ffmpeg already installed · cut video to exact start/end time · timeline UI with draggable handles
📋 How to Build — Video Trim
  1. 1
    ffmpeg command: ffmpeg -ss 00:00:10 -to 00:00:30 -i input.mp4 -c copy output.mp4 — trims from 10s to 30s. -c copy = no re-encoding = instant, lossless cut.
  2. 2
    Frontend: Show a horizontal timeline bar. User drags left handle (start time) and right handle (end time). Show timecodes in real time (00:10 — 00:30).
  3. 3
    Add HTML5 video preview so user can watch the selected clip before trimming. On play, video jumps to start time automatically.
  4. 4
    Total build time: ~3 hours including timeline UI.
▼ How to Build
Video Watermark — Strong PRO conversion
HIGH PRO CONVERSION ffmpeg overlay filter · businesses + content creators · free = centre watermark, PRO = custom position + opacity
📋 How to Build — Video Watermark
  1. 1
    Image / logo watermark: ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=W-w-10:H-h-10" output.mp4 — places logo in bottom-right corner, 10px from edges. Strong PRO conversion for watermark feature especially.
  2. 2
    Text watermark: ffmpeg -i input.mp4 -vf "drawtext=text='CONFIDENTIAL':fontsize=40:fontcolor=white@0.5:x=(w-text_w)/2:y=(h-text_h)/2" output.mp4
  3. 3
    Watermark positions: Top-left (overlay=10:10), Top-right (W-w-10:10), Bottom-left (10:H-h-10), Bottom-right (W-w-10:H-h-10), Centre ((W-w)/2:(H-h)/2).
  4. 4
    Free tier: fixed centre position, default opacity 50%. PRO: custom position picker, adjustable opacity slider, custom font/colour for text watermark.
  5. 5
    Total build time: ~2.5 hours.
▼ How to Build
Sign PDF (typed + image signature) — 900K searches/month
HIGH PRO CONVERSION reportlab overlay · different from PDF Protect (adds visible signature, not password) · freelancers + contractors use daily · iLovePDF + Smallpdf both have this
📋 How to Build — Sign PDF
  1. 1
    Option A — Typed signature: User types their name, picks a cursive font. Frontend renders on HTML5 canvas, exports as transparent PNG. Backend overlays on PDF: page.insert_image(rect, filename=sig_png_path) (PyMuPDF).
  2. 2
    Option B — Drawn signature: Use react-signature-canvas npm (free). User draws with mouse/finger on canvas → exports PNG → same backend overlay process.
  3. 3
    Option C — Image upload: User uploads scanned signature. Use rembg to remove white background → overlay transparently on PDF at user-chosen position.
  4. 4
    Let user click on a PDF page preview to set signature position. Drag handles to resize. Free: 1 placement. PRO: multiple + save signature for reuse.
  5. 5
    Total build time: ~5 hours.
▼ How to Build
PDF Compare (show differences between two versions)
MEDIUM Lawyers, editors, and academics use this constantly · very high professional value = high willingness to pay for PRO
📋 How to Build — PDF Compare
  1. 1
    Extract text from both PDFs with PyMuPDF. Use Python difflib: import difflib; diff = list(difflib.unified_diff(text1.splitlines(), text2.splitlines(), lineterm=''))
  2. 2
    Display as side-by-side columns. Added lines = green highlight, removed lines = red highlight, unchanged = white. Page-by-page breakdown.
  3. 3
    Summary at top: "12 additions, 5 deletions across 3 pages." Changed page numbers as clickable jump links.
  4. 4
    Primary use: contract review (lawyer checking v1 vs v2). Very high PRO conversion. Total build time: ~3 hours.
▼ How to Build
PDF Annotate (highlight, comment, underline, draw)
HIGH PyMuPDF annotation API · iLovePDF core feature · students + academics = large, loyal audience
📋 How to Build — PDF Annotate
  1. 1
    PyMuPDF full annotation support: Highlight: page.add_highlight_annot(rect). Underline: page.add_underline_annot(rect). Comment: page.add_text_annot(point, "comment").
  2. 2
    Frontend: Render PDF pages as images. Overlay interactive canvas on top. User selects annotation tool (highlight/underline/comment/draw), interacts with canvas, sends annotation coordinates to backend.
  3. 3
    Backend applies annotations via PyMuPDF and returns the annotated PDF for download. Consider making this PRO-only — it's a very sticky feature that reduces churn.
  4. 4
    Total build time: ~5 hours (complex frontend canvas work).
▼ How to Build
PDF Redact — Black out sensitive text (Legal / HR / Government)
HIGH PyMuPDF proper redaction API · permanently removes text (not just covers it) · lawyers + HR = high willingness to pay
📋 How to Build — PDF Redact
  1. 1
    PyMuPDF redaction API properly removes the underlying text (unlike drawing a black box, which is a common security mistake): page.add_redact_annot(rect, fill=(0,0,0)); page.apply_redactions()
  2. 2
    Frontend: Render PDF as canvas. User draws black rectangles over sensitive areas. Send rectangle coordinates to backend for proper redaction.
  3. 3
    "Search and Redact" feature: User types a word/phrase → backend finds all instances → redacts them all. Very powerful for legal discovery work.
  4. 4
    Always warn: "⚠️ Redaction permanently removes content and cannot be undone." Total build time: ~3 hours.
▼ How to Build
🧑‍💻 Phase 5 — Developer & Power User Revenue Weeks 7–10
Developer API with API key auth
HIGH Wire up existing ApiKeys page · POST /api/pdf/compress · most reliable revenue — developers rarely churn because switching APIs is painful and time-consuming
📋 How to Build — Developer API
  1. 1
    Your ApiKeys table and page already exist. Add a FastAPI dependency to check keys on endpoints: async def verify_api_key(x_api_key: str = Header(...)): key = db.query(ApiKey).filter_by(key=x_api_key, is_active=True).first(); if not key: raise HTTPException(401)
  2. 2
    Add dependency to tool endpoints: @app.post("/api/v1/pdf/compress") async def api_compress(file: UploadFile, key=Depends(verify_api_key)):
  3. 3
    Track usage per key. Return usage in response headers: X-Usage-Count: 142, X-Usage-Limit: 1000.
  4. 4
    Total build time: ~3 hours to wire up all major endpoints.
▼ How to Build
Per-call billing via Razorpay
HIGH ₹1/API call or ₹999/month for 5,000 calls · developers budget API costs separately from personal expenses · very reliable payment behaviour
📋 How to Build — API Billing
  1. 1
    Pricing tiers: Free = 100 calls/month, Starter = ₹499/month for 2,000 calls, Pro = ₹999/month for 10,000 calls. Developers budget API costs separately from personal expenses — very reliable payment.
  2. 2
    Add monthly_api_calls counter to ApiKeys table. Increment on every successful API call. Reset on 1st of each month via a cron job.
  3. 3
    When free limit (100 calls) is hit, return HTTP 429: {"error": "Monthly API limit reached", "upgrade_url": "https://documateo.com/pricing#api"}
  4. 4
    Create an API-specific section on /pricing. Developers look for this explicitly. Also create a /developers page (see next item). Total build time: ~4 hours.
▼ How to Build
API Documentation page at /developers
HIGH Good docs = developers share on Stack Overflow + Reddit = free backlinks forever · ilovepdf's docs page alone has generated thousands of backlinks from developer communities
📋 How to Build — API Docs Page
  1. 1
    FastAPI auto-generates Swagger docs at /docs already. But create a nicer custom page at /developers that people actually share and bookmark.
  2. 2
    For each endpoint include: Authentication method (API key in X-API-Key header), Request format (multipart/form-data), Response format (JSON + file), Code examples in Python, JavaScript, and cURL.
  3. 3
    Example cURL: curl -X POST https://api.documateo.com/api/v1/pdf/compress -H "X-API-Key: your_key" -F "file=@doc.pdf" -o compressed.pdf
  4. 4
    Add a prominent "Get Free API Key" button. Frictionless signup — email only, no credit card needed. Total build time: ~3 hours.
▼ How to Build
Tool Pipeline / Chain Operations (Compress → Watermark → Protect)
HIGH Free = 1 step, PRO = unlimited chain steps · #1 converting PRO feature because it saves significant time for power users
📋 How to Build — Tool Pipeline
  1. 1
    Concept: User uploads one file, selects a sequence of operations to run in order (Compress → Add Watermark → Password Protect). One upload, one download, all steps applied.
  2. 2
    Backend: POST /api/pipeline accepts file + JSON steps array: [{"tool": "compress", "quality": 70}, {"tool": "watermark", "text": "CONFIDENTIAL"}, {"tool": "protect", "password": "1234"}]. Apply each step sequentially, feeding output of one into the next.
  3. 3
    Frontend: Visual pipeline builder — user drags tool blocks into a sequence. Show estimated output file size after each step.
  4. 4
    Free: max 1 step (same as current single tools). PRO: up to 5 steps in sequence. This is the most powerful upgrade argument you have. Total build time: ~5 hours.
▼ How to Build
PDF Translate — iLovePDF AI feature (Future Goal)
FUTURE DeepL or Google Translate API · iLovePDF just launched this · strong international demand · India → English especially
📋 How to Build — PDF Translate
  1. 1
    Extract text from PDF with PyMuPDF. Send to translation API. DeepL API: 500,000 chars/month free. Google Translate API: $20 per 1M chars (pay per use).
  2. 2
    Simple approach: translate extracted text, deliver as plain .docx or .txt. Advanced: preserve PDF layout by translating text blocks and re-inserting at same coordinates via PyMuPDF.
  3. 3
    Priority language pairs: English ↔ Hindi, English ↔ Spanish, English ↔ French, English ↔ Arabic. These cover the majority of global demand.
  4. 4
    Free: 1 page. PRO: full document. Strong international PRO conversion. Total build time: ~4 hours.
▼ How to Build
🔒 Why Security Matters (Beginner Explanation)
Security isn't just about protecting data — it directly affects your income. A hacked website loses its Google ranking instantly. Users who feel unsafe don't return. AdSense can ban you if malicious code appears on your site. Fix these once and you're protected for years.
✅ Already Completed
These are done — tick them to reflect your real progress
Googlebot Whitelist — Fixed ✅
DONE Googlebot was getting a 403 error from your FastAPI middleware — now fixed and whitelisted
Cloudflare CDN — Active ✅
DONE Cloudflare is handling traffic, DDoS protection, caching, and HTTPS — working correctly
Security Headers — Grade A on securityheaders.com ✅
DONE All 6 headers added via Cloudflare Transform Rules including CSP, HSTS, X-Frame-Options, and more
SSL Full (strict) + Always HTTPS enabled ✅
DONE All traffic forced to HTTPS, SSL set to Full (strict) in Cloudflare — no "Not Secure" warnings
🔴 Still To Do — Critical
These are your remaining security tasks — check off as you complete them
File Upload Validation — Prevent Malicious File Uploads
CRITICAL FastAPI · check MIME type using python-magic · reject anything not PDF/image/video
📋 Guide — Server-Side File Validation
⚠️ Attackers can rename a PHP script as "report.pdf" and upload it. Server-side validation checks the actual file contents, not just the filename.
  1. 1
    Add to requirements.txt: python-magic then redeploy on Railway.
  2. 2
    In your FastAPI upload handler, add: import magic → read first 2048 bytes → check MIME type against allowlist: ["application/pdf", "image/jpeg", "image/png", "image/webp", "video/mp4"] → reject anything else with HTTP 400.
  3. 3
    Never store files with their original filename. Use uuid.uuid4() to generate a random name — prevents path traversal attacks.
  4. 4
    Store uploads in a temp directory that is NOT web-accessible. Only serve the processed output, never the raw upload.
  5. 5
    Test: try uploading a .txt file renamed as .pdf — should get a 400 error.
▼ Show Steps
Enable 2FA on all accounts (Cloudflare, Railway, GitHub, Google, Razorpay)
CRITICAL Free · 15 min · if your password leaks, 2FA is the only thing stopping a takeover
📋 Guide — Enable 2FA on All Accounts
  1. 1
    Cloudflare: dash.cloudflare.com → My Profile (top right) → Authentication → Enable Two-Factor Authentication.
  2. 2
    GitHub: github.com → Settings → Password and authentication → Two-factor authentication → Enable.
  3. 3
    Railway: railway.app → Account Settings → Security → Two-Factor Authentication.
  4. 4
    Google (covers GA4, GSC, AdSense): myaccount.google.com → Security → 2-Step Verification → Turn on.
  5. 5
    Razorpay: dashboard.razorpay.com → Settings → Profile → Two-Factor Authentication.
  6. 6
    Use Microsoft Authenticator (already on your phone) for all of these — scan the QR code shown during setup for each account.
  7. 7
    Save the backup/recovery codes somewhere safe — print them or store in a password manager like Bitwarden (free).
▼ Show Steps
Check GitHub repo for exposed secrets / API keys
CRITICAL Free · 10 min · bots scan GitHub 24/7 — exposed Razorpay keys can drain your account
📋 Guide — Scanning for Exposed Secrets
  1. 1
    Check your .gitignore — must include: .env, .env.local, .env.production.
  2. 2
    In your GitHub repo, use the search bar to search for "RAZORPAY", "SECRET", "PASSWORD". If any appear in actual code files — that's a problem.
  3. 3
    For full history scan: pip install trufflehogtrufflehog git https://github.com/yourusername/yourrepo
  4. 4
    If any secrets found in history: immediately rotate those keys (new Razorpay keys, etc.) then purge the git history.
  5. 5
    Going forward: all secrets in Railway's Environment Variables panel only — never in code.
▼ Show Steps
Automatic file deletion — delete uploads after processing
CRITICAL Privacy compliance + storage cost · delete user files within 1 hour of upload
📋 Guide — Auto-Delete Uploaded Files
⚠️ Keeping user files on your server longer than needed creates GDPR risk and wastes Railway storage. Delete immediately after sending the processed file back to the user.
  1. 1
    In each FastAPI endpoint, after sending the response, delete both the input and output files: import os; os.remove(input_path); os.remove(output_path)
  2. 2
    Add a background cleanup task using FastAPI's BackgroundTasks — schedules deletion after the response is sent so it doesn't slow down the user.
  3. 3
    Also add a fallback hourly sweep: using Python's apscheduler library, run a job every hour that deletes any files in /tmp older than 60 minutes.
▼ Show Steps
Enable Cloudflare Bot Fight Mode + WAF managed ruleset
HIGH Free · 2 min · blocks known malicious bots automatically
📋 Guide — Cloudflare Bot & WAF Setup
  1. 1
    Cloudflare dashboard → documateo.com → SecurityBots → Bot Fight Mode → toggle ON.
  2. 2
    Security → WAF → Managed Rules → enable the Cloudflare Managed Ruleset (free tier includes this).
  3. 3
    Security → DDoS → HTTP DDoS attack protection → set to High.
▼ Show Steps
Run npm audit and fix critical/high vulnerabilities
HIGH Free · 10 min · checks all your React packages for known security holes
📋 Guide — npm audit
  1. 1
    In your React project folder terminal: npm audit — shows all vulnerabilities by severity.
  2. 2
    Run npm audit fix — auto-fixes most issues.
  3. 3
    For remaining issues: npm audit fix --force — then test your app still works.
  4. 4
    Also run on backend: pip install safetysafety check -r requirements.txt
  5. 5
    Enable Dependabot on GitHub: repo → Settings → Code security → enable Dependabot alerts. It will auto-PR future fixes.
▼ Show Steps
💡 What Is "Reachability"?
Reachability means: can people find you, reach you, and trust you — across Google, social, directories, and performance benchmarks. Every item here is free. Together they compound over time to bring more organic traffic without spending on ads.
🔍 Section 1 — Google Presence High Impact
Make Google trust and understand your site better
Add structured data (Schema markup) to your tool pages
HIGH IMPACT Free · 1-2 hrs total · makes Google show rich results for your tools
📋 Guide — Adding Schema Markup
⚠️ What is this? Schema markup is invisible code you add to your pages that tells Google exactly what your page is — "this is a software tool called PDF Compressor, it does X, it's free". Google uses this to show richer search results (star ratings, tool descriptions, breadcrumbs) which dramatically increases click-through rates.
  1. 1
    For each tool page, add a SoftwareApplication schema. In your React tool component, add inside the <head> (via react-helmet or your index.html):
    <script type="application/ld+json">
    {"@context":"https://schema.org","@type":"SoftwareApplication","name":"PDF Compressor","applicationCategory":"UtilitiesApplication","operatingSystem":"Web","offers":{"@type":"Offer","price":"0","priceCurrency":"USD"},"description":"Compress PDF files online for free"}
    </script>
  2. 2
    For your blog posts, add Article schema with datePublished, author, and headline fields.
  3. 3
    For your homepage, add WebSite schema with a SearchAction — this enables the Google sitelinks searchbox.
  4. 4
    Test your schema at search.google.com/test/rich-results — paste your URL and see what Google detects.
  5. 5
    After deploying, go to GSC → Enhancements → you'll see rich result data appear within 2-4 weeks.
💡 This is one of the highest-leverage free SEO actions. Sites with schema markup get 20-30% higher click-through rates from the same Google ranking position.
▼ Show Steps
Create and submit an XML sitemap to Google Search Console
HIGH IMPACT Free · 15 min · tells Google every page that exists on your site
📋 Guide — Sitemap Submission
  1. 1
    Check if your sitemap already exists: visit https://documateo.com/sitemap.xml in your browser. If it loads, you're good. If not, create one.
  2. 2
    To create: use xml-sitemaps.com (free, crawls your site automatically) or manually create a sitemap.xml listing all your tool and blog URLs.
  3. 3
    Place sitemap.xml in your public/ folder so it's accessible at the root URL.
  4. 4
    In GSC → Sitemaps → enter sitemap.xml → click Submit. GSC will now crawl all listed URLs.
  5. 5
    Also add this line to your public/robots.txt: Sitemap: https://documateo.com/sitemap.xml
  6. 6
    Re-submit sitemap every time you add a significant batch of new pages (e.g. after adding 10+ new blog posts or tools).
▼ Show Steps
Set up Google Business Profile (free listing)
MEDIUM Free · 20 min · makes your brand appear in Google's knowledge panel
📋 Guide — Google Business Profile
  1. 1
    Go to business.google.com → click "Manage now" → sign in with your Google account.
  2. 2
    Search for "ARWebTools" — it probably doesn't exist yet. Click "Add your business".
  3. 3
    Business name: ARWebTools or Documateo. Category: Software Company or Internet Company.
  4. 4
    Add your website URL, description, and support email. You don't need a physical address for online businesses.
  5. 5
    Verify ownership (usually via email or Google Search Console connection).
  6. 6
    Once live, when someone searches "Documateo" or "ARWebTools" on Google, your brand panel appears on the right. This significantly boosts trust.
▼ Show Steps
⚡ Section 2 — Site Performance Google Ranks Fast Sites Higher
Core Web Vitals — Google's speed ranking signals
Run PageSpeed Insights and fix your Core Web Vitals score
HIGH IMPACT Free · Google uses this as a ranking signal · target 90+ on mobile
📋 Guide — Improving PageSpeed Score
⚠️ Why does this matter for ranking? Google officially uses page speed as a ranking factor. A slow site (score below 50) ranks lower than a fast competitor even if your content is better. Most issues are fixable for free.
  1. 1
    Go to pagespeed.web.dev → enter https://documateo.com → run analysis. Focus on the Mobile score (harder to achieve, bigger ranking impact).
  2. 2
    Fix: Largest Contentful Paint (LCP) — usually your hero image or logo. Make sure your logo is WebP format (not PNG/JPG) and add loading="eager" to the hero image tag.
  3. 3
    Fix: Cumulative Layout Shift (CLS) — add explicit width and height attributes to all <img> tags. This prevents layout jumping as images load.
  4. 4
    Fix: Unused JavaScript — in your React build, enable code splitting: use React.lazy() and Suspense for heavy tool components so they only load when needed.
  5. 5
    Enable Cloudflare's speed features: Speed → Optimization → Auto Minify (enable JS, CSS, HTML) + Rocket Loader → ON. These are free and often add 10-15 points to your score.
  6. 6
    Enable Cloudflare Caching: Caching → Configuration → Browser Cache TTL = 4 hours. Caching Rule → Cache Everything for static assets.
💡 A score of 90+ on mobile puts you in the top 10% of websites globally. Each 10-point improvement measurably increases Google ranking positions for competitive keywords.
▼ Show Steps
Add Open Graph meta tags to all pages (social sharing previews)
HIGH Free · 30 min · when someone shares your link on WhatsApp, LinkedIn, Twitter — shows a proper preview card
📋 Guide — Open Graph Tags
  1. 1
    In each page component, use react-helmet (or your existing helmet setup) to add these meta tags:
    <meta property="og:title" content="PDF Compressor — Documateo" />
    <meta property="og:description" content="Compress PDF files online free. No signup required." />
    <meta property="og:image" content="https://documateo.com/og-image.png" />
    <meta property="og:url" content="https://documateo.com/pdf/compress" />
    <meta property="og:type" content="website" />
  2. 2
    Create one OG image (1200×630px) in Canva (free) — your logo + tagline on a clean background. Save as og-image.png in your public folder.
  3. 3
    Also add Twitter card tags:
    <meta name="twitter:card" content="summary_large_image" />
    <meta name="twitter:title" content="PDF Compressor — Documateo" />
  4. 4
    Test: go to opengraph.xyz → paste your URL → see exactly what preview appears when shared. Fix until it looks professional.
💡 Without OG tags, sharing your URL on WhatsApp shows a blank preview. With them, it shows a proper card with image, title, and description — dramatically increasing click-through when people share your tools.
▼ Show Steps
📋 Section 3 — Free Directory Listings Backlinks + Traffic
Submit to free directories — each gives a backlink and potential users
Submit to Product Hunt
HIGH Free · can drive hundreds of signups in a single day if you get upvotes · plan your launch
📋 Guide — Product Hunt Launch
⚠️ Product Hunt launches work best when planned. Don't just submit and hope. Build a small audience first (even 20 people who will upvote on launch day makes a huge difference).
  1. 1
    Create an account at producthunt.com — spend 1-2 weeks engaging with other launches first (upvote, comment). New accounts that launch immediately get less traction.
  2. 2
    Prepare your listing: name = "Documateo", tagline = "Free PDF, image & video tools — no signup, no ads, browser-only", upload 4-5 screenshots of your best tools.
  3. 3
    Schedule your launch for a Tuesday or Wednesday — these are the highest-traffic days. Launch at 12:01 AM PST (the daily leaderboard resets at midnight PST).
  4. 4
    Before launching, tell friends, WhatsApp contacts, LinkedIn connections to visit Product Hunt and upvote on launch day. Don't send direct links to the PH page before launch — it can get you disqualified.
  5. 5
    On launch day: be active in the comments — reply to every comment within 30 minutes. This signals engagement and boosts your ranking.
💡 A successful Product Hunt launch (top 5 of the day) can bring 500-2,000 visitors in 24 hours and gives you a permanent "Featured on Product Hunt" badge to display on your site.
▼ Show Steps
Submit to free tool directories (backlinks + traffic)
HIGH Free · 1 hr total · each submission = 1 backlink + potential traffic forever
📋 Guide — Free Directory Submissions
  1. 1
    AlternativeTo.net — submit Documateo as an alternative to iLovePDF, Smallpdf, Adobe Acrobat. Free. Each "alternative" listing drives people searching those tools to find you.
  2. 2
    SaaSHub.com — free SaaS directory. Submit at saashub.com/submit. Gives a dofollow backlink.
  3. 3
    Toolify.ai — directory of online tools. Free submission.
  4. 4
    There's An AI For That (theresanaiforthat.com) — if any of your tools use AI (background removal, etc.), submit here. Huge traffic source.
  5. 5
    Hacker News "Show HN" — post "Show HN: Documateo – free browser-based PDF/image/video tools" on news.ycombinator.com. Do this on a weekday morning US time. Even modest traction here drives quality developer traffic.
  6. 6
    Reddit — post in r/webtools, r/Entrepreneur, r/SideProject. Be genuine — explain what you built and why. Don't spam.
💡 Each directory submission takes 5-10 minutes and creates a permanent backlink. 10 backlinks from reputable directories = measurable improvement in Google rankings within 4-8 weeks.
▼ Show Steps
Create a free Bing Webmaster Tools account and submit sitemap
MEDIUM Free · 10 min · Bing = 7% of search traffic · most sites ignore it = easy wins
📋 Guide — Bing Webmaster Tools
  1. 1
    Go to bing.com/webmasters → sign in with Microsoft account → Add your site: https://documateo.com.
  2. 2
    Verify ownership — easiest method: import from Google Search Console (one click if you're already verified in GSC).
  3. 3
    Submit your sitemap: Sitemaps → Submit sitemap → https://documateo.com/sitemap.xml.
  4. 4
    Use Bing's free "URL Inspection" tool to request indexing of your most important pages immediately.
💡 Bing also powers DuckDuckGo, Yahoo, and Microsoft Edge search. Getting indexed here adds meaningful traffic at zero cost — and competition is much lower than Google.
▼ Show Steps
✨ Section 4 — UX Fine-Tuning Retention + Trust
Small changes that make users stay longer and come back
Add a favicon and app icons (PWA-ready)
HIGH Free · 15 min · missing favicon looks unprofessional and hurts GSC click-through rates
📋 Guide — Favicon Setup
  1. 1
    Go to favicon.io (free) → generate a favicon from your logo or text → download the ZIP file.
  2. 2
    Place all generated files (favicon.ico, apple-touch-icon.png, android-chrome-*.png) in your public/ folder.
  3. 3
    In public/index.html, add in the <head>:
    <link rel="icon" type="image/x-icon" href="/favicon.ico">
    <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
  4. 4
    Also update your public/manifest.json with your app name and icon paths — this enables "Add to Home Screen" on mobile browsers.
▼ Show Steps
Add a 404 page with helpful links back to your tools
MEDIUM Free · 20 min · reduces bounce rate when users land on dead URLs
📋 Guide — Custom 404 Page
  1. 1
    In your React router, add a catch-all route: <Route path="*" element={<NotFound />} />.
  2. 2
    Create a NotFound.jsx component. Keep it friendly — "Oops, this page doesn't exist." with your logo and branding.
  3. 3
    Add 3-4 links: "Go to PDF Tools", "Go to Image Tools", "Go Home". This recovers lost users instead of sending them away.
  4. 4
    Also create a public/_redirects file (for Cloudflare Pages) with: /* /index.html 200 — this ensures React Router handles all routes correctly.
▼ Show Steps
Add a "Related Tools" section at the bottom of each tool page
HIGH Free · improves internal linking (SEO) + keeps users on site longer
📋 Guide — Related Tools Widget
  1. 1
    After the main tool output area, add a "You might also need:" section.
  2. 2
    PDF Compressor → suggest: PDF Merger, PDF Splitter, PDF to Image.
  3. 3
    Image Compressor → suggest: Image Resize, Background Remover, Image Converter.
  4. 4
    Display as simple card grid (2-4 tools, with icon + name + short description). Keep it clean.
  5. 5
    This doubles as internal linking — Google follows these links and discovers/re-crawls your other tool pages more frequently.
💡 Canva, iLovePDF, and every major tool site does this. Users who just compressed a PDF often immediately need to merge or protect it. Don't let them go to a competitor for the next step.
▼ Show Steps
Add a visible email capture / newsletter signup (Brevo free)
HIGH Free on Brevo · builds an owned audience you can re-market to forever
📋 Guide — Email List Building
⚠️ Why does this matter? Google traffic can disappear overnight (algorithm update). An email list is traffic you own — no algorithm can take it away. Even 500 subscribers = a reliable base of users to announce new tools, promotions, or blog posts to.
  1. 1
    You already have Brevo set up. In Brevo → Forms → Create a subscription form. Keep it dead simple: just an email field + "Get notified of new tools" button.
  2. 2
    Embed the form in your site footer (visible on every page) and optionally as a subtle banner after a user successfully uses a tool ("Liked this tool? Get notified of new ones →").
  3. 3
    Offer a small incentive: "Subscribe and get a free PDF compression cheatsheet" — create a simple 1-page PDF tip sheet in Canva (takes 20 minutes, free).
  4. 4
    In Brevo, set up a simple welcome email: sent automatically when someone subscribes. Just say thank you + link to your most popular tools.
▼ Show Steps
📊 How to Check if a Page is Indexed (Step by Step)
1
Go to search.google.com/search-console → URL Inspection → paste a URL.
2
If it says "URL is on Google" → mark it as Indexed here (click the item below).
3
If it says "URL is not on Google" → click "Request Indexing" in GSC → mark as Pending here.
4
Do 10 pages per day. Come back tomorrow and check the ones you requested yesterday.
Indexing Status Overview
Indexed: 0 Pending: 0
Analytics Stack — Know Your Numbers
Google Search Console (GSC)
ACTIVE ✅ Shows how your site appears in Google search
Google Analytics 4 (GA4)
ACTIVE ✅ Shows visitor counts, behavior, traffic sources
Microsoft Clarity — Session recordings + heatmaps
HIGH clarity.microsoft.com · FREE forever · 15 min setup
📋 Clarity Setup Guide
  1. 1
    Go to clarity.microsoft.com → Sign in with Microsoft account → Add new project.
  2. 2
    Enter project name = Documateo, URL = https://documateo.com. Click Continue.
  3. 3
    Copy the JavaScript snippet. Paste into your site's <head> tag (in public/index.html).
  4. 4
    Deploy site. Data starts appearing within a few hours of receiving traffic.
  5. 5
    After 3 days: Watch 5 session recordings → note where users get confused. Check heatmaps on /pdf/compress and /image/remove-bg.
▼ Show Setup Guide
Set up GA4 conversion events for PRO upgrades + affiliate clicks
MEDIUM Measures what actually earns money
📋 Guide — Setting Up GA4 Conversion Tracking
⚠️ What is a "conversion event"? An event is something you track in GA4. A conversion event is a specific action you care about — like someone clicking "Upgrade to PRO" or clicking an affiliate link. Without tracking these, you're flying blind on what's earning money.
  1. 1
    In your React app, import GA4: import ReactGA from 'react-ga4'. Initialize with your tracking ID.
  2. 2
    Track PRO upgrade button clicks: ReactGA.event({ category: 'Revenue', action: 'PRO Upgrade Click', label: 'trigger_type' }).
  3. 3
    Track affiliate link clicks: ReactGA.event({ category: 'Revenue', action: 'Affiliate Click', label: 'adobe_acrobat' }).
  4. 4
    Track tool completions: ReactGA.event({ category: 'Engagement', action: 'Tool Used', label: 'pdf_compress' }).
  5. 5
    In GA4 dashboard: Admin → Events → Mark your revenue events as "Conversions". Then you can see daily conversion counts.
▼ Show Guide
Hosting & Infrastructure
Cloudflare Pages — Frontend hosting
ACTIVE ✅ Free · CDN · DDoS protection
Set up Railway uptime monitoring (avoid cold starts)
HIGH Prevents 30-second load time on first request after idle
📋 Guide — Preventing Railway Cold Starts
⚠️ What is a cold start? Railway's free tier "sleeps" your server when there's no traffic for a while. When a user visits, they wait 15-30 seconds for the server to wake up. This kills conversions — users think the site is broken and leave.
  1. 1
    Go to uptimerobot.com — free tier lets you monitor 50 websites. Sign up free.
  2. 2
    Add a new monitor: Type = HTTP(s), URL = your Railway backend URL (e.g., https://documateo-api.railway.app/health), Interval = every 5 minutes.
  3. 3
    This pings your server every 5 minutes, keeping it "awake" so users never experience a cold start.
  4. 4
    Bonus: UptimeRobot also emails you if your site goes down — so you know about outages before your users complain.
  5. 5
    Make sure your FastAPI has a /health endpoint that just returns {"status": "ok"}. This is the endpoint UptimeRobot pings.
▼ Show Guide
Payment & Email
Razorpay — Payment gateway (INR subscriptions)
ACTIVE ✅ Enable 7-day free trial in plan settings
Brevo — Email marketing (300 emails/day free)
CONNECTED ✅ Set up email capture flow next
Revenue Forecast by Month
MonthEst. VisitorsAdSenseAffiliatesPRO SubsTotal
1500–2,000₹150–₹600₹100–₹400₹50–₹100₹300–₹1,100
22,000–6,000₹600–₹1,800₹700–₹2,500₹200–₹1,000₹1,500–₹5,300
36,000–15,000₹1,800–₹4,500₹1,500–₹5,000₹700–₹3,500₹4,000–₹13,000
415,000–30,000₹4,500–₹9,000₹3,000–₹12,000₹2,000–₹6,000₹9,500–₹27,000
530,000–60,000₹9,000–₹18,000₹6,000–₹22,000₹6,000–₹11,000₹21,000–₹51,000
660,000–1,20,000₹18,000–₹36,000₹12,000–₹60,000₹16,000–₹27,000₹46,000–₹1,23,000
Assumptions: AdSense RPM ₹30–₹50 (Indian traffic). Affiliate 0.1–0.2% click-to-sale rate. PRO conversion 0.3–0.5% of visitors. All estimates assume AdSense + Ezoic from Month 3 (2-3× RPM boost).
Ad Revenue Upgrade Path
Now
Google AdSense
RPM: ₹30–₹50. Auto Ads for first 2 weeks. Manual optimization after.
10k sessions/mo
Ezoic
RPM: ₹80–₹150. AI-optimized ad placement. 2-3× revenue improvement overnight.
50k sessions/mo
Mediavine
RPM: ₹200–₹400. Premium publishers. Very high-quality ads. Application required.
100k sessions/mo
Raptive (AdThrive)
RPM: ₹400–₹800. Top tier. Invitation or application. Best RPM available.
Affiliate Income Roadmap
Month 1
Adobe Acrobat + Canva Pro
₹600–₹2,500/sale. Apply this week. 2-5 day approval. Highest priority.
Month 2
Grammarly + Notion (CJ Affiliate)
Grammarly pays per free signup. Notion pays per upgrade. Easy contextual fit.
Month 3+
ilovepdf competitors, Pdfgear, more
Expand affiliate portfolio as traffic grows. Higher traffic = easier approvals.
🗓️ Your Weekly Routine (Total: ~4 hours/week)
The secret to SEO growth isn't one big push — it's consistent small actions every week. Here's your sustainable weekly routine that compounds over time:
Monday (45 min)
📊 Check GA4 → note top pages, traffic trends
🔍 Check GSC → any new rankings? Errors?
💰 Check AdSense/Ezoic earnings from last week
📋 Request indexing for 10 pages in GSC (until all done)
Tuesday (60 min)
✍️ Write or outline 1 new blog post
Use ChatGPT for first draft, then edit for authenticity
Add internal links to/from new post
Request indexing for new post in GSC
Wednesday (30 min)
🔧 Ship 1 small improvement to existing tool
Or add internal links to 5 existing tool pages
Or improve 1 blog post (add FAQ, expand word count)
Thursday (45 min)
🔧 Work on tool roadmap (Phase 1 first)
Build or improve 1 tool feature
Add affiliate links to any new content
Friday (30 min)
📝 Review Clarity heatmaps — any UX issues?
💾 Back up dashboard progress
Note 3 wins from this week + 3 goals for next week
🔒 Check UptimeRobot for any downtime alerts this week
Weekend (Optional)
📖 Read 1 SEO article or tool website case study
Answer Reddit questions about PDF/image tools
Check competitor sites for new features/content ideas
📈 Monthly Review Checklist
Monthly GA4 review — which pages brought the most traffic?
MONTHLY
Monthly GSC review — which keywords are you ranking for?
MONTHLYPerformance → Queries → sort by Impressions
Revenue review — which stream earned most? Double down on it.
MONTHLY
Backup dashboard progress to Google Doc or Notion
MONTHLYNever lose your progress data
Set goals for next month based on what worked
MONTHLY
Run npm audit on frontend + pip safety check on backend
MONTHLY SECURITY2 min each · catches new vulnerabilities in packages
Check securityheaders.com score — should remain A or B
MONTHLY SECURITYsecurityheaders.com → scan documateo.com
Check Sentry for any unresolved errors from past month
MONTHLY SECURITYsentry.io dashboard → review open issues
Verify SSL certificate still Active in Cloudflare
MONTHLY SECURITYCloudflare → SSL/TLS → Edge Certificates
🔥 Active Notes / Current Focus
💡 Ideas & Future Features
🎯 Wins & Milestones
📌
Golden Rule: Frontend = Cloudflare Pages (static React). Backend = FastAPI on VPS. Database = PostgreSQL on same VPS. Payments = Razorpay. Everything connects via REST API over HTTPS.
🏗️ System Architecture — Big Picture
┌──────────────────────────────────────────────────────┐ │ USER BROWSER │ └────────────────────────┬─────────────────────────────┘ │ HTTPS ▼ ┌──────────────────────────────────────────────────────┐ │ CLOUDFLARE PAGES (documateo.com) │ │ • Serves React build (dist/ folder) │ │ • Cloudflare Function (_worker.js) for SEO/SSR │ │ • Auto-deploy: push to GitHub → Cloudflare builds │ └────────────────────────┬─────────────────────────────┘ │ API calls to backend ▼ ┌──────────────────────────────────────────────────────┐ │ VPS SERVER — 178.104.75.35 │ │ User: documateo (NEVER root in production) │ │ │ │ ┌────────────────────────────────────────────┐ │ │ │ FastAPI Backend (Python) │ │ │ │ Port: 8000 │ Entry: app/main.py │ │ │ │ Managed by: systemd service │ │ │ │ Path: /home/documateo/documateo-backend/ │ │ │ └──────────────────┬─────────────────────────┘ │ │ │ SQL queries │ │ ▼ │ │ ┌────────────────────────────────────────────┐ │ │ │ PostgreSQL │ Port: 5432 │ │ │ │ DB: documateo │ User: documateo_user │ │ │ └────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────┘ │ │ ▼ ▼ Razorpay Brevo Email (Payments API) (future — email list)
📂 Project Folder Structure
DOCUMATEO-LIVE/ ├── .venv/ ← Python virtual env (local only) ├── documateo-backend/ ← FastAPI Python app │ ├── app/ ← All backend code lives here │ │ ├── main.py ← FastAPI entry point │ │ ├── models.py ← DB table definitions (SQLAlchemy) │ │ ├── schemas.py ← Request/response shapes (Pydantic) │ │ ├── database.py ← DB connection setup │ │ ├── config.py ← Settings loaded from .env │ │ └── routers/ ← API route handlers │ │ ├── auth.py ← Login, signup, JWT tokens │ │ ├── payments.py ← Razorpay orders & webhooks │ │ ├── subscriptions.py ← Plan management │ │ ├── tools.py ← Tool usage tracking │ │ └── users.py ← User profile / admin │ ├── alembic/ ← DB migration files │ ├── alembic.ini ← Migration config │ ├── requirements.txt ← Python dependencies │ ├── .env ← ⚠️ SECRET — never commit! │ ├── backup.sql ← DB backup (keep updated!) │ ├── Dockerfile ← Docker config (optional) │ └── seed_tools.py ← Seeds the tools table │ └── documateo-frontend/ ← React (Vite) app ├── src/ ← All React code here │ ├── pages/ ← Route-level pages │ │ ├── tools/ ← One file per tool │ │ ├── Dashboard.jsx ← User dashboard │ │ └── Pricing.jsx ← Pricing page │ ├── components/ ← Shared UI components │ ├── hooks/ ← Custom React hooks │ ├── api.js ← Axios client (all backend calls) │ └── App.jsx ← Router / app entry ├── dist/ ← Built output → deployed to Cloudflare ├── functions/ ← Cloudflare Pages Functions ├── public/ ← Static assets + sitemap.xml ├── .env ← Dev env vars ├── .env.production ← Production env vars └── index.html ← HTML template
🔄 How Frontend & Backend Talk
React makes HTTP requests to FastAPI. FastAPI queries PostgreSQL. Frontend never touches the DB directly. JWT token is the handshake.
  1. 1
    Page load: User visits documateo.com → Cloudflare serves React app + SSR HTML for bots via the Worker function.
  2. 2
    Login: React calls POST /api/auth/login → FastAPI validates credentials → returns JWT token → React stores token in localStorage.
  3. 3
    Tool use: React calls POST /api/tools/use with JWT in Authorization header → backend checks subscription plan → allows/blocks → logs usage to DB.
  4. 4
    Payment: React calls POST /api/payments/create-order → FastAPI creates Razorpay order → user pays → Razorpay sends webhook to /api/payments/webhook → FastAPI upgrades user plan in DB.
  5. 5
    API base URL is set in documateo-frontend/.env.production as VITE_API_URL. Currently: http://178.104.75.35:8000
📊 Database Tables
TableWhat it storesKey columns
usersAll registered usersid, email, role, plan, created_at
toolsMaster list of all toolsslug, category, required_plan
tool_usagesEach time a user runs a tooluser_id, tool_slug, used_at
paymentsRazorpay orders & statusid, razorpay_order_id, status, amount
subscriptionsActive subscriptions per useruser_id, plan, start_date, end_date, status
usage_logsDetailed usage eventsuser_id, action, metadata, created_at
🔌 Open Ports on VPS
PortServiceNotes
22SSHServer access — keep this open always
8000FastAPI BackendPublic — frontend calls this port
5432PostgreSQL⚠️ Open to 0.0.0.0 — restrict to your IP when migrations are done
🚨
NEVER commit .env files to git. They contain DB passwords, API keys, and JWT secrets. Verify .gitignore has .env in both frontend and backend folders right now.
🐍 Backend — documateo-backend/.env
# Database — PostgreSQL on VPS DATABASE_URL=postgresql://documateo_user:YOUR_DB_PASSWORD@localhost:5432/documateo # JWT Auth — use a long random string, never change once set SECRET_KEY=your-long-random-secret-key-here ALGORITHM=HS256 ACCESS_TOKEN_EXPIRE_MINUTES=1440 # Razorpay — from dashboard.razorpay.com → Settings → API Keys RAZORPAY_KEY_ID=rzp_live_XXXXXXXX RAZORPAY_KEY_SECRET=XXXXXXXXXXXXXXXXXXXXXXXX # App settings ENVIRONMENT=production ALLOWED_ORIGINS=https://documateo.com,https://www.documateo.com
⚛️ Frontend — documateo-frontend/.env.production
# Backend API URL — where React sends all API calls VITE_API_URL=http://178.104.75.35:8000 # Once you add SSL to backend, update to: https://api.documateo.com # Razorpay public key (KEY_ID only — safe to expose) VITE_RAZORPAY_KEY_ID=rzp_live_XXXXXXXX VITE_APP_URL=https://documateo.com
🔁 How to Update Env Variables
Update backend .env on VPS
ssh documateo@178.104.75.35 cd documateo-backend nano .env # Edit values → Ctrl+O to save → Enter → Ctrl+X to exit # Restart backend to pick up new values: sudo systemctl restart documateo
Update frontend env vars (Cloudflare)
Go to Cloudflare Dashboard → Pages → documateo → Settings → Environment Variables

Add or edit any VITE_* variable. Then trigger a redeploy: Deployments → Retry deployment — or push a new commit to GitHub.
🔐 SSH Into Server
# ALWAYS log in as documateo — never root in production ssh documateo@178.104.75.35 # Need sudo/root for something? Once inside: sudo su - # Exit root back to documateo: exit
🔄 systemd — Manage the Backend Service
# Check if backend is running sudo systemctl status documateo # Restart backend (after code or .env changes) sudo systemctl restart documateo # Start / Stop sudo systemctl start documateo sudo systemctl stop documateo # View live logs (Ctrl+C to exit) sudo journalctl -u documateo -f # View last 100 log lines sudo journalctl -u documateo -n 100 # Make backend auto-start on server reboot sudo systemctl enable documateo
🗄️ Connect to Database
# From VPS (fastest — no password prompt if you're the right user) ssh documateo@178.104.75.35 psql -U documateo_user -d documateo # From your LOCAL machine psql -h 178.104.75.35 -U documateo_user -d documateo # Quick one-liner query (no interactive session) psql -h 178.104.75.35 -U documateo_user -d documateo -c "SELECT COUNT(*) FROM users;"
🧾 Useful DB Queries — Copy-Paste Ready
-- Show all tables \dt -- Health check: row counts across all tables SELECT relname AS table_name, n_live_tup AS row_count FROM pg_stat_user_tables ORDER BY n_live_tup DESC; -- Count each main table SELECT COUNT(*) FROM users; SELECT COUNT(*) FROM payments; SELECT COUNT(*) FROM subscriptions; SELECT COUNT(*) FROM tool_usages; SELECT COUNT(*) FROM usage_logs; -- Recent users SELECT id, email, role FROM users ORDER BY id DESC LIMIT 10; -- Recent payments SELECT id, razorpay_order_id, status FROM payments ORDER BY id DESC LIMIT 10; -- Active subscriptions SELECT u.email, s.plan, s.status, s.end_date FROM subscriptions s JOIN users u ON u.id = s.user_id WHERE s.status = 'active'; -- Recent activity log SELECT * FROM usage_logs ORDER BY id DESC LIMIT 10; -- Tool access rules SELECT slug, category, required_plan FROM tools ORDER BY category; -- Exit psql \q
💾 Backup & Restore Database
# BACKUP — from your LOCAL machine (saves to current folder) pg_dump -h 178.104.75.35 -U documateo_user -d documateo > backup_$(date +%Y%m%d).sql # BACKUP — from VPS itself ssh documateo@178.104.75.35 pg_dump -U documateo_user -d documateo > ~/backup_$(date +%Y%m%d).sql # Download backup from VPS to local machine scp documateo@178.104.75.35:~/backup_20260130.sql ./ # RESTORE — import .sql file into database psql -h 178.104.75.35 -U documateo_user -d documateo -f backup_20260130.sql # AUTOMATED DAILY BACKUP — add this to crontab on VPS # Run: crontab -e then add this line: 0 2 * * * pg_dump -U documateo_user documateo > /home/documateo/backups/db_$(date +\%Y\%m\%d).sql
⚠️ Do a manual backup at minimum once a week until automated backups are set up. Keep at least 3 recent backups. One copy locally, one in Google Drive.
🔄 Database Migrations (Alembic)
Use Alembic whenever you change models.py — add/remove columns, rename tables, etc. Run from your LOCAL machine inside documateo-backend/
# Check current migration status alembic current # Create new migration after changing models.py alembic revision --autogenerate -m "add column xyz to users" # Apply migrations to live database alembic upgrade head # Roll back one migration (if something broke) alembic downgrade -1 # View full migration history alembic history
🔥 Firewall (UFW) Commands
# Check firewall status sudo ufw status # Open a port sudo ufw allow 8000 # Restrict DB port to your IP only (safer!) sudo ufw delete allow 5432 sudo ufw allow from YOUR_IP_ADDRESS to any port 5432 # Reload after changes sudo ufw reload
💡
Deploy flow in one line: Frontend = push to GitHub → Cloudflare auto-builds. Backend = push to GitHub → SSH in → git pull → restart service.
⚛️ Frontend Deploy (Auto via Cloudflare)
── On your LOCAL machine ── cd documateo-frontend # Make your changes in src/ # Test locally first: npm run dev # Open http://localhost:5173 # When happy, commit and push: git add . git commit -m "feat: what you changed" git push origin main # Cloudflare Pages will auto: # 1. Detect the push # 2. Run: npm run build # 3. Deploy dist/ to CDN — takes ~2 minutes # Monitor at: Cloudflare Dashboard → Pages → documateo → Deployments
💡 Cloudflare Pages settings: Build command = npm run build · Output directory = dist · Root = documateo-frontend · Branch = main
🐍 Backend Deploy (Manual — SSH to VPS)
── STEP 1: On your LOCAL machine ── cd documateo-backend # Edit your code, test locally: source ../.venv/bin/activate uvicorn app.main:app --reload # (Ctrl+C to stop) # Commit and push: git add . git commit -m "fix: describe change" git push origin main ── STEP 2: On the VPS ── ssh documateo@178.104.75.35 cd documateo-backend # Pull latest code git pull origin main # If requirements.txt changed, install new deps: source venv/bin/activate pip install -r requirements.txt # If models.py changed, run migrations: alembic upgrade head # Restart the service sudo systemctl restart documateo # Verify it started OK sudo systemctl status documateo sudo journalctl -u documateo -n 20
🛠️ How to Add a New Tool Page
  1. 1
    Create documateo-frontend/src/pages/tools/YourTool.jsx — copy an existing tool page as a template.
  2. 2
    Add the route in src/App.jsx: <Route path="/tool/your-tool" element={<YourTool />} />
  3. 3
    Add tool to the backend tools table — edit seed_tools.py and run it, or insert directly via SQL: INSERT INTO tools (slug, category, required_plan) VALUES ('your-tool', 'pdf', 'free');
  4. 4
    Add the URL to documateo-frontend/public/sitemap.xml.
  5. 5
    Push to GitHub → Cloudflare auto-deploys → Go to GSC → URL Inspection → paste new URL → Request Indexing.
📦 If You Add a New Python Package
# On LOCAL machine: source ../.venv/bin/activate pip install new-package-name pip freeze > requirements.txt git add requirements.txt && git commit -m "add: new-package" && git push # On VPS after git pull: source venv/bin/activate pip install -r requirements.txt sudo systemctl restart documateo
⚡ Quick Check — Daily (5 mins)
  1. 1
    Site loads: Open https://documateo.com in incognito. Does it load? Can you run a tool?
  2. 2
    Backend alive: curl http://178.104.75.35:8000/health — should return a 200 response.
  3. 3
    Service status: SSH in → sudo systemctl status documateo → must say active (running) in green.
  4. 4
    DB alive: psql -U documateo_user -d documateo -c "SELECT COUNT(*) FROM users;" — if it returns a number, DB is healthy.
  5. 5
    GSC: Open Google Search Console → Coverage → check for any new errors.
🔍 Full Check — Weekly (30 mins)
  1. 1
    Server resources: df -h (disk) and free -h (RAM). If disk >80% full, clean up logs first.
  2. 2
    Review app logs: sudo journalctl -u documateo -n 200 — scan for ERROR or WARNING lines. Fix recurring ones.
  3. 3
    DB backup: Run pg_dump -h 178.104.75.35 -U documateo_user -d documateo > backup_$(date +%Y%m%d).sql and save it.
  4. 4
    DB row counts: Run the health check query — confirm counts are growing as expected. Sudden drops = data issue.
  5. 5
    GSC Performance: Check which queries you're appearing for. Update page titles for any URL with high impressions but low CTR.
  6. 6
    System updates: sudo apt update && sudo apt list --upgradable — apply security patches monthly.
  7. 7
    Test payment flow: Go through Razorpay test mode — confirm order creation and webhook work end to end.
🚨 Emergency — Backend Is Down
If the site can't call the API or users can't log in, do these in order:
  1. 1
    SSH in: ssh documateo@178.104.75.35
  2. 2
    Check status: sudo systemctl status documateo — read the error message in red text.
  3. 3
    Read logs: sudo journalctl -u documateo -n 50 — the error is almost always in the last 10 lines.
  4. 4
    Try restarting: sudo systemctl restart documateo — fixes 80% of transient issues.
  5. 5
    If restart fails, check DB: sudo systemctl status postgresql — restart it if it's stopped.
  6. 6
    Check disk space: df -h — if 100% full, clear old logs: sudo journalctl --vacuum-size=100M
  7. 7
    Run manually to see full error: cd ~/documateo-backend && source venv/bin/activate && uvicorn app.main:app --host 0.0.0.0 --port 8000
📅 Monthly Server Maintenance
ssh documateo@178.104.75.35 # 1. Update system packages (security patches) sudo apt update && sudo apt upgrade -y # 2. Remove unused packages sudo apt autoremove -y # 3. Rotate logs (keeps last 200MB of journal logs) sudo journalctl --vacuum-size=200M # 4. Clean tmp files sudo rm -rf /tmp/* # 5. Database vacuum (frees space from deleted rows) psql -U documateo_user -d documateo -c "VACUUM ANALYZE;" # 6. Check disk space after cleanup df -h
📁 Log File Locations
Log typeCommand to view it
Backend app logssudo journalctl -u documateo -f
PostgreSQL logssudo tail -f /var/log/postgresql/postgresql-*.log
System auth logssudo tail -f /var/log/auth.log
Firewall logssudo tail -f /var/log/ufw.log
App error logsls ~/documateo-backend/logs/
🔒 Security To-Do (Outstanding)
New user created (documateo) — root SSH disabled
PermitRootLogin no in /etc/ssh/sshd_config ✓
UFW Firewall enabled
SSH, API port 8000, DB port 5432 open. All others blocked.
⚠️
PostgreSQL open to 0.0.0.0 — restrict when ready
sudo ufw delete allow 5432 && sudo ufw allow from YOUR_IP to any port 5432
⚠️
SSH password auth still enabled
Set up SSH keys first, then set PasswordAuthentication no in /etc/ssh/sshd_config
🔴
No fail2ban installed
sudo apt install fail2ban -y && sudo systemctl enable fail2ban && sudo systemctl start fail2ban
🔴
No automated DB backups
Run crontab -e on VPS → add: 0 2 * * * pg_dump -U documateo_user documateo > /home/documateo/backups/db_$(date +\%Y\%m\%d).sql
🔴
Backend API has no SSL (HTTP only)
Get domain for API (api.documateo.com), add Let's Encrypt SSL, update VITE_API_URL in frontend to https://.
🔄 Full Stack Restart (When Everything Feels Off)
ssh documateo@178.104.75.35 # 1. Restart PostgreSQL first sudo systemctl restart postgresql # 2. Wait for DB to be ready sleep 3 # 3. Restart backend sudo systemctl restart documateo # 4. Verify both are running sudo systemctl status postgresql sudo systemctl status documateo