chore: update project branding from SaaS-PDF to Dociva
- Updated robots.txt to reflect new site name and sitemap URL. - Modified sitemap.xml to change all URLs from saas-pdf.com to dociva.io. - Changed storage key for site assistant in SiteAssistant.tsx. - Updated SEOHead.tsx to change site name in meta tags. - Translated app name and related text in Arabic, English, and French JSON files. - Updated contact email in ContactPage.tsx, PrivacyPage.tsx, and TermsPage.tsx. - Changed internal admin page title to reflect new branding. - Updated pricing page meta description to reference Dociva. - Adjusted Nginx configuration for new domain. - Modified deployment script to reflect new branding. - Updated sitemap generation script to use new domain.
This commit is contained in:
@@ -5,7 +5,7 @@ SECRET_KEY=change-me-in-production
|
|||||||
INTERNAL_ADMIN_EMAILS=admin@example.com
|
INTERNAL_ADMIN_EMAILS=admin@example.com
|
||||||
|
|
||||||
# Site Domain (used in sitemap, robots.txt, emails)
|
# Site Domain (used in sitemap, robots.txt, emails)
|
||||||
SITE_DOMAIN=https://saas-pdf.com
|
SITE_DOMAIN=https://dociva.io
|
||||||
|
|
||||||
# Redis
|
# Redis
|
||||||
REDIS_URL=redis://redis:6379/0
|
REDIS_URL=redis://redis:6379/0
|
||||||
@@ -22,7 +22,7 @@ OPENROUTER_BASE_URL=https://openrouter.ai/api/v1/chat/completions
|
|||||||
# AWS S3
|
# AWS S3
|
||||||
AWS_ACCESS_KEY_ID=your-access-key
|
AWS_ACCESS_KEY_ID=your-access-key
|
||||||
AWS_SECRET_ACCESS_KEY=your-secret-key
|
AWS_SECRET_ACCESS_KEY=your-secret-key
|
||||||
AWS_S3_BUCKET=saas-pdf-temp-files
|
AWS_S3_BUCKET=dociva-temp-files
|
||||||
AWS_S3_REGION=eu-west-1
|
AWS_S3_REGION=eu-west-1
|
||||||
|
|
||||||
# File Processing
|
# File Processing
|
||||||
@@ -30,7 +30,7 @@ MAX_CONTENT_LENGTH_MB=50
|
|||||||
UPLOAD_FOLDER=/tmp/uploads
|
UPLOAD_FOLDER=/tmp/uploads
|
||||||
OUTPUT_FOLDER=/tmp/outputs
|
OUTPUT_FOLDER=/tmp/outputs
|
||||||
FILE_EXPIRY_SECONDS=1800
|
FILE_EXPIRY_SECONDS=1800
|
||||||
DATABASE_PATH=/app/data/saas_pdf.db
|
DATABASE_PATH=/app/data/dociva.db
|
||||||
|
|
||||||
# CORS
|
# CORS
|
||||||
CORS_ORIGINS=http://localhost:5173,http://localhost:3000
|
CORS_ORIGINS=http://localhost:5173,http://localhost:3000
|
||||||
@@ -49,7 +49,7 @@ SENTRY_ENVIRONMENT=development
|
|||||||
DATABASE_URL=
|
DATABASE_URL=
|
||||||
|
|
||||||
# Frontend
|
# Frontend
|
||||||
VITE_SITE_DOMAIN=https://saas-pdf.com
|
VITE_SITE_DOMAIN=https://dociva.io
|
||||||
VITE_SENTRY_DSN=
|
VITE_SENTRY_DSN=
|
||||||
|
|
||||||
# Frontend Analytics / Ads (Vite)
|
# Frontend Analytics / Ads (Vite)
|
||||||
|
|||||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -53,3 +53,7 @@ logs/
|
|||||||
htmlcov/
|
htmlcov/
|
||||||
.coverage
|
.coverage
|
||||||
coverage/
|
coverage/
|
||||||
|
|
||||||
|
# Celery
|
||||||
|
celerybeat-schedule
|
||||||
|
backend/celerybeat-schedule
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
# Contributing to SaaS-PDF
|
# Contributing to Dociva
|
||||||
|
|
||||||
## Safety Rules
|
## Safety Rules
|
||||||
|
|
||||||
|
|||||||
10
README.md
10
README.md
@@ -1,6 +1,8 @@
|
|||||||
# SaaS-PDF — Free Online Tools Platform
|
# Dociva — Free Online Tools Platform
|
||||||
|
|
||||||
A free SaaS platform offering PDF, image, video, and text processing tools. Built with **Python Flask** (backend) and **React + Vite** (frontend), powered by **Celery + Redis** for async processing, and deployed on **AWS**.
|
A free SaaS platform offering PDF, image, video, and text processing tools. Built with **Python Flask** (backend) and **React + Vite** (frontend), powered by **Celery + Redis** for async processing.
|
||||||
|
|
||||||
|
**Live at:** [https://dociva.io](https://dociva.io)
|
||||||
|
|
||||||
## 🛠 Tools (Current)
|
## 🛠 Tools (Current)
|
||||||
|
|
||||||
@@ -65,7 +67,7 @@ docker-compose up --build
|
|||||||
- Session-backed authentication via `/api/auth/*`
|
- Session-backed authentication via `/api/auth/*`
|
||||||
- Free account creation with email + password
|
- Free account creation with email + password
|
||||||
- Recent generated-file history via `/api/history`
|
- Recent generated-file history via `/api/history`
|
||||||
- Persistent SQLite storage at `DATABASE_PATH` (defaults to `backend/data/saas_pdf.db` locally)
|
- Persistent SQLite storage at `DATABASE_PATH` (defaults to `backend/data/dociva.db` locally)
|
||||||
|
|
||||||
## 📈 Analytics & Ads Env
|
## 📈 Analytics & Ads Env
|
||||||
|
|
||||||
@@ -80,7 +82,7 @@ docker-compose up --build
|
|||||||
## 📁 Project Structure
|
## 📁 Project Structure
|
||||||
|
|
||||||
```
|
```
|
||||||
SaaS-PDF/
|
Dociva/
|
||||||
├── backend/ # Flask API + Celery Workers
|
├── backend/ # Flask API + Celery Workers
|
||||||
├── frontend/ # React + Vite + TypeScript
|
├── frontend/ # React + Vite + TypeScript
|
||||||
├── nginx/ # Reverse proxy configuration
|
├── nginx/ # Reverse proxy configuration
|
||||||
|
|||||||
@@ -9,6 +9,6 @@ def health_check():
|
|||||||
"""Simple health check — returns 200 if the service is running."""
|
"""Simple health check — returns 200 if the service is running."""
|
||||||
return jsonify({
|
return jsonify({
|
||||||
"status": "healthy",
|
"status": "healthy",
|
||||||
"service": "SaaS-PDF API",
|
"service": "Dociva API",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -63,11 +63,11 @@ def save_message(name: str, email: str, category: str, subject: str, message: st
|
|||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
# Send notification email to admin
|
# Send notification email to admin
|
||||||
admin_email = current_app.config.get("SMTP_FROM", "noreply@saas-pdf.com")
|
admin_email = current_app.config.get("SMTP_FROM", "noreply@dociva.io")
|
||||||
try:
|
try:
|
||||||
send_email(
|
send_email(
|
||||||
to=admin_email,
|
to=admin_email,
|
||||||
subject=f"[SaaS-PDF Contact] [{category}] {subject}",
|
subject=f"[Dociva Contact] [{category}] {subject}",
|
||||||
html_body=f"""
|
html_body=f"""
|
||||||
<h2>New Contact Message</h2>
|
<h2>New Contact Message</h2>
|
||||||
<p><strong>From:</strong> {name} <{email}></p>
|
<p><strong>From:</strong> {name} <{email}></p>
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ def _get_smtp_config() -> dict:
|
|||||||
"port": current_app.config.get("SMTP_PORT", 587),
|
"port": current_app.config.get("SMTP_PORT", 587),
|
||||||
"user": current_app.config.get("SMTP_USER", ""),
|
"user": current_app.config.get("SMTP_USER", ""),
|
||||||
"password": current_app.config.get("SMTP_PASSWORD", ""),
|
"password": current_app.config.get("SMTP_PASSWORD", ""),
|
||||||
"from_addr": current_app.config.get("SMTP_FROM", "noreply@saas-pdf.com"),
|
"from_addr": current_app.config.get("SMTP_FROM", "noreply@dociva.io"),
|
||||||
"use_tls": current_app.config.get("SMTP_USE_TLS", True),
|
"use_tls": current_app.config.get("SMTP_USE_TLS", True),
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,11 +62,11 @@ def send_password_reset_email(to: str, token: str) -> bool:
|
|||||||
html = f"""
|
html = f"""
|
||||||
<div style="font-family: sans-serif; max-width: 480px; margin: auto;">
|
<div style="font-family: sans-serif; max-width: 480px; margin: auto;">
|
||||||
<h2>Password Reset</h2>
|
<h2>Password Reset</h2>
|
||||||
<p>You requested a password reset for your SaaS-PDF account.</p>
|
<p>You requested a password reset for your Dociva account.</p>
|
||||||
<p><a href="{reset_link}" style="display:inline-block;padding:12px 24px;background:#4f46e5;color:#fff;border-radius:8px;text-decoration:none;">
|
<p><a href="{reset_link}" style="display:inline-block;padding:12px 24px;background:#4f46e5;color:#fff;border-radius:8px;text-decoration:none;">
|
||||||
Reset Password
|
Reset Password
|
||||||
</a></p>
|
</a></p>
|
||||||
<p style="color:#666;font-size:14px;">This link expires in 1 hour. If you didn't request this, you can safely ignore this email.</p>
|
<p style="color:#666;font-size:14px;">This link expires in 1 hour. If you didn't request this, you can safely ignore this email.</p>
|
||||||
</div>
|
</div>
|
||||||
"""
|
"""
|
||||||
return send_email(to, "Reset your SaaS-PDF password", html)
|
return send_email(to, "Reset your Dociva password", html)
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ TOOL_CATALOG = [
|
|||||||
{"slug": "text-cleaner", "label": "Text Cleaner", "summary": "clean up text spacing and formatting"},
|
{"slug": "text-cleaner", "label": "Text Cleaner", "summary": "clean up text spacing and formatting"},
|
||||||
]
|
]
|
||||||
|
|
||||||
SYSTEM_PROMPT = """You are the SaaS-PDF site assistant.
|
SYSTEM_PROMPT = """You are the Dociva site assistant.
|
||||||
You help users choose the right tool, understand how to use the current tool, and explain site capabilities.
|
You help users choose the right tool, understand how to use the current tool, and explain site capabilities.
|
||||||
Rules:
|
Rules:
|
||||||
- Reply in the same language as the user.
|
- Reply in the same language as the user.
|
||||||
|
|||||||
Binary file not shown.
@@ -29,7 +29,7 @@ class BaseConfig:
|
|||||||
OUTPUT_FOLDER = os.getenv("OUTPUT_FOLDER", "/tmp/outputs")
|
OUTPUT_FOLDER = os.getenv("OUTPUT_FOLDER", "/tmp/outputs")
|
||||||
FILE_EXPIRY_SECONDS = int(os.getenv("FILE_EXPIRY_SECONDS", 1800))
|
FILE_EXPIRY_SECONDS = int(os.getenv("FILE_EXPIRY_SECONDS", 1800))
|
||||||
DATABASE_PATH = os.getenv(
|
DATABASE_PATH = os.getenv(
|
||||||
"DATABASE_PATH", os.path.join(BASE_DIR, "data", "saas_pdf.db")
|
"DATABASE_PATH", os.path.join(BASE_DIR, "data", "dociva.db")
|
||||||
)
|
)
|
||||||
PERMANENT_SESSION_LIFETIME = timedelta(days=30)
|
PERMANENT_SESSION_LIFETIME = timedelta(days=30)
|
||||||
SESSION_COOKIE_HTTPONLY = True
|
SESSION_COOKIE_HTTPONLY = True
|
||||||
@@ -94,7 +94,7 @@ class BaseConfig:
|
|||||||
# AWS S3
|
# AWS S3
|
||||||
AWS_ACCESS_KEY_ID = os.getenv("AWS_ACCESS_KEY_ID")
|
AWS_ACCESS_KEY_ID = os.getenv("AWS_ACCESS_KEY_ID")
|
||||||
AWS_SECRET_ACCESS_KEY = os.getenv("AWS_SECRET_ACCESS_KEY")
|
AWS_SECRET_ACCESS_KEY = os.getenv("AWS_SECRET_ACCESS_KEY")
|
||||||
AWS_S3_BUCKET = os.getenv("AWS_S3_BUCKET", "saas-pdf-temp-files")
|
AWS_S3_BUCKET = os.getenv("AWS_S3_BUCKET", "dociva-temp-files")
|
||||||
AWS_S3_REGION = os.getenv("AWS_S3_REGION", "eu-west-1")
|
AWS_S3_REGION = os.getenv("AWS_S3_REGION", "eu-west-1")
|
||||||
|
|
||||||
# CORS
|
# CORS
|
||||||
@@ -116,7 +116,7 @@ class BaseConfig:
|
|||||||
SMTP_PORT = int(os.getenv("SMTP_PORT", 587))
|
SMTP_PORT = int(os.getenv("SMTP_PORT", 587))
|
||||||
SMTP_USER = os.getenv("SMTP_USER", "")
|
SMTP_USER = os.getenv("SMTP_USER", "")
|
||||||
SMTP_PASSWORD = os.getenv("SMTP_PASSWORD", "")
|
SMTP_PASSWORD = os.getenv("SMTP_PASSWORD", "")
|
||||||
SMTP_FROM = os.getenv("SMTP_FROM", "noreply@saas-pdf.com")
|
SMTP_FROM = os.getenv("SMTP_FROM", "noreply@dociva.io")
|
||||||
SMTP_USE_TLS = os.getenv("SMTP_USE_TLS", "true").lower() == "true"
|
SMTP_USE_TLS = os.getenv("SMTP_USE_TLS", "true").lower() == "true"
|
||||||
FRONTEND_URL = os.getenv("FRONTEND_URL", "http://localhost:5173")
|
FRONTEND_URL = os.getenv("FRONTEND_URL", "http://localhost:5173")
|
||||||
|
|
||||||
@@ -131,7 +131,7 @@ class BaseConfig:
|
|||||||
SENTRY_ENVIRONMENT = os.getenv("SENTRY_ENVIRONMENT", "development")
|
SENTRY_ENVIRONMENT = os.getenv("SENTRY_ENVIRONMENT", "development")
|
||||||
|
|
||||||
# Site domain
|
# Site domain
|
||||||
SITE_DOMAIN = os.getenv("SITE_DOMAIN", "https://saas-pdf.com")
|
SITE_DOMAIN = os.getenv("SITE_DOMAIN", "https://dociva.io")
|
||||||
|
|
||||||
# PostgreSQL (production) — set DATABASE_URL to use PG instead of SQLite
|
# PostgreSQL (production) — set DATABASE_URL to use PG instead of SQLite
|
||||||
DATABASE_URL = os.getenv("DATABASE_URL", "")
|
DATABASE_URL = os.getenv("DATABASE_URL", "")
|
||||||
@@ -153,6 +153,7 @@ class ProductionConfig(BaseConfig):
|
|||||||
DEBUG = False
|
DEBUG = False
|
||||||
TESTING = False
|
TESTING = False
|
||||||
SESSION_COOKIE_SECURE = True
|
SESSION_COOKIE_SECURE = True
|
||||||
|
SESSION_COOKIE_SAMESITE = "Lax"
|
||||||
# Stricter rate limits in production
|
# Stricter rate limits in production
|
||||||
RATELIMIT_DEFAULT = "60/hour"
|
RATELIMIT_DEFAULT = "60/hour"
|
||||||
|
|
||||||
@@ -163,7 +164,7 @@ class TestingConfig(BaseConfig):
|
|||||||
TESTING = True
|
TESTING = True
|
||||||
UPLOAD_FOLDER = "/tmp/test_uploads"
|
UPLOAD_FOLDER = "/tmp/test_uploads"
|
||||||
OUTPUT_FOLDER = "/tmp/test_outputs"
|
OUTPUT_FOLDER = "/tmp/test_outputs"
|
||||||
DATABASE_PATH = "/tmp/test_saas_pdf.db"
|
DATABASE_PATH = "/tmp/test_dociva.db"
|
||||||
FEATURE_EDITOR = False
|
FEATURE_EDITOR = False
|
||||||
FEATURE_OCR = False
|
FEATURE_OCR = False
|
||||||
FEATURE_REMOVEBG = False
|
FEATURE_REMOVEBG = False
|
||||||
|
|||||||
@@ -17,8 +17,8 @@ from app.services.stripe_service import init_stripe_db
|
|||||||
def app():
|
def app():
|
||||||
"""Create application for testing."""
|
"""Create application for testing."""
|
||||||
os.environ['FLASK_ENV'] = 'testing'
|
os.environ['FLASK_ENV'] = 'testing'
|
||||||
test_root = tempfile.mkdtemp(prefix='saas-pdf-tests-')
|
test_root = tempfile.mkdtemp(prefix='dociva-tests-')
|
||||||
db_path = os.path.join(test_root, 'test_saas_pdf.db')
|
db_path = os.path.join(test_root, 'test_dociva.db')
|
||||||
upload_folder = os.path.join(test_root, 'uploads')
|
upload_folder = os.path.join(test_root, 'uploads')
|
||||||
output_folder = os.path.join(test_root, 'outputs')
|
output_folder = os.path.join(test_root, 'outputs')
|
||||||
os.environ['DATABASE_PATH'] = db_path
|
os.environ['DATABASE_PATH'] = db_path
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# خطة رفع SaaS-PDF إلى مستوى المنافسة
|
# خطة رفع Dociva إلى مستوى المنافسة
|
||||||
|
|
||||||
## Summary
|
## Summary
|
||||||
- اعتماد مسار نمو واضح: `B2C SEO-first` أولاً، ثم `Freemium monetization`، ثم `B2B API expansion`.
|
- اعتماد مسار نمو واضح: `B2C SEO-first` أولاً، ثم `Freemium monetization`، ثم `B2B API expansion`.
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# SaaS-PDF — SEO & Growth Strategy
|
# Dociva — SEO & Growth Strategy
|
||||||
|
|
||||||
> Roadmap to **500 000 monthly visits** for a multilingual (EN / AR / FR) free-tool SaaS.
|
> Roadmap to **500 000 monthly visits** for a multilingual (EN / AR / FR) free-tool SaaS.
|
||||||
|
|
||||||
@@ -37,7 +37,7 @@ VITE_GA_MEASUREMENT_ID=G-XXXXXXXXXX
|
|||||||
### Plausible (Privacy-Friendly Alternative)
|
### Plausible (Privacy-Friendly Alternative)
|
||||||
|
|
||||||
```env
|
```env
|
||||||
VITE_PLAUSIBLE_DOMAIN=saas-pdf.com
|
VITE_PLAUSIBLE_DOMAIN=Dociva.com
|
||||||
VITE_PLAUSIBLE_SRC=https://plausible.io/js/script.js # or self-hosted URL
|
VITE_PLAUSIBLE_SRC=https://plausible.io/js/script.js # or self-hosted URL
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -127,7 +127,7 @@ All text is i18n-driven from `seo.{toolKey}.*` keys in EN/AR/FR.
|
|||||||
- "كيفية دمج ملفات PDF" (Arabic equivalent)
|
- "كيفية دمج ملفات PDF" (Arabic equivalent)
|
||||||
- "comment fusionner des fichiers PDF" (French equivalent)
|
- "comment fusionner des fichiers PDF" (French equivalent)
|
||||||
- [ ] Each blog post links to the relevant tool page (internal linking)
|
- [ ] Each blog post links to the relevant tool page (internal linking)
|
||||||
- [ ] Create comparison pages: "SaaS-PDF vs iLovePDF vs SmallPDF"
|
- [ ] Create comparison pages: "Dociva vs iLovePDF vs SmallPDF"
|
||||||
|
|
||||||
**Keyword Research Strategy:**
|
**Keyword Research Strategy:**
|
||||||
- Target 200–500 keywords across three tiers:
|
- Target 200–500 keywords across three tiers:
|
||||||
@@ -206,7 +206,7 @@ All text is i18n-driven from `seo.{toolKey}.*` keys in EN/AR/FR.
|
|||||||
| PDF24 | ~40M | Desktop app + web tools | Lightweight, faster load, mobile-first |
|
| PDF24 | ~40M | Desktop app + web tools | Lightweight, faster load, mobile-first |
|
||||||
| Sejda | ~10M | Advanced editing features | More tools, trilingual content |
|
| Sejda | ~10M | Advanced editing features | More tools, trilingual content |
|
||||||
|
|
||||||
**Key differentiators for SaaS-PDF:**
|
**Key differentiators for Dociva:**
|
||||||
1. **Trilingual** — EN/AR/FR from day one (Arabic market is largely unserved)
|
1. **Trilingual** — EN/AR/FR from day one (Arabic market is largely unserved)
|
||||||
2. **No signup** — zero friction, instant file processing
|
2. **No signup** — zero friction, instant file processing
|
||||||
3. **32 tools** — broader coverage than most competitors
|
3. **32 tools** — broader coverage than most competitors
|
||||||
@@ -239,7 +239,7 @@ All text is i18n-driven from `seo.{toolKey}.*` keys in EN/AR/FR.
|
|||||||
VITE_GA_MEASUREMENT_ID=G-XXXXXXXXXX
|
VITE_GA_MEASUREMENT_ID=G-XXXXXXXXXX
|
||||||
|
|
||||||
# Plausible Analytics (optional, privacy-friendly)
|
# Plausible Analytics (optional, privacy-friendly)
|
||||||
VITE_PLAUSIBLE_DOMAIN=saas-pdf.com
|
VITE_PLAUSIBLE_DOMAIN=Dociva.com
|
||||||
VITE_PLAUSIBLE_SRC=https://plausible.io/js/script.js
|
VITE_PLAUSIBLE_SRC=https://plausible.io/js/script.js
|
||||||
|
|
||||||
# Google Search Console verification (optional)
|
# Google Search Console verification (optional)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# SaaS-PDF — Tool Inventory & Competitive Gap Analysis
|
# Dociva — Tool Inventory & Competitive Gap Analysis
|
||||||
|
|
||||||
> Generated: March 7, 2026
|
> Generated: March 7, 2026
|
||||||
> Branch: `feature/critical-maintenance-and-editor`
|
> Branch: `feature/critical-maintenance-and-editor`
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
VITE_SITE_DOMAIN=https://saas-pdf.com
|
VITE_SITE_DOMAIN=https://dociva.io
|
||||||
VITE_SENTRY_DSN=
|
VITE_SENTRY_DSN=
|
||||||
VITE_GA_MEASUREMENT_ID=G-XXXXXXXXXX
|
VITE_GA_MEASUREMENT_ID=G-XXXXXXXXXX
|
||||||
VITE_PLAUSIBLE_DOMAIN=
|
VITE_PLAUSIBLE_DOMAIN=
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# CLAUDE.md — SaaS-PDF Codebase Rules & Design System Reference
|
# CLAUDE.md — Dociva Codebase Rules & Design System Reference
|
||||||
|
|
||||||
> Comprehensive rules document for AI-assisted development and Figma-to-code integration via Model Context Protocol (MCP).
|
> Comprehensive rules document for AI-assisted development and Figma-to-code integration via Model Context Protocol (MCP).
|
||||||
|
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
## 1. Project Overview
|
## 1. Project Overview
|
||||||
|
|
||||||
SaaS-PDF is a full-stack web application offering 16+ free online file-processing tools (PDF, image, video, text). The architecture is a **Python/Flask backend** with **Celery workers** for async processing, and a **React + TypeScript frontend** styled with **Tailwind CSS**.
|
Dociva is a full-stack web application offering 16+ free online file-processing tools (PDF, image, video, text). The architecture is a **Python/Flask backend** with **Celery workers** for async processing, and a **React + TypeScript frontend** styled with **Tailwind CSS**.
|
||||||
|
|
||||||
### Tech Stack Summary
|
### Tech Stack Summary
|
||||||
|
|
||||||
@@ -506,7 +506,7 @@ Used via classes: `.progress-bar-animated`, `.animate-in`
|
|||||||
### 9.1 Directory Layout
|
### 9.1 Directory Layout
|
||||||
|
|
||||||
```
|
```
|
||||||
SaaS-PDF/
|
Dociva/
|
||||||
├── frontend/ # React SPA
|
├── frontend/ # React SPA
|
||||||
│ ├── src/
|
│ ├── src/
|
||||||
│ │ ├── components/ # UI Components (layout/, shared/, tools/)
|
│ │ ├── components/ # UI Components (layout/, shared/, tools/)
|
||||||
|
|||||||
@@ -6,24 +6,24 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<meta name="description" content="Free online tools for PDF, image, video, and text processing. Merge, split, compress, convert, watermark, protect & more — instantly." />
|
<meta name="description" content="Free online tools for PDF, image, video, and text processing. Merge, split, compress, convert, watermark, protect & more — instantly." />
|
||||||
<meta name="keywords" content="PDF tools, merge PDF, split PDF, compress PDF, PDF to Word, image converter, free online tools, Arabic PDF tools" />
|
<meta name="keywords" content="PDF tools, merge PDF, split PDF, compress PDF, PDF to Word, image converter, free online tools, Arabic PDF tools" />
|
||||||
<meta name="author" content="SaaS-PDF" />
|
<meta name="author" content="Dociva" />
|
||||||
<meta name="robots" content="index, follow" />
|
<meta name="robots" content="index, follow" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:title" content="SaaS-PDF — Free Online File Tools" />
|
<meta property="og:title" content="Dociva — Free Online File Tools" />
|
||||||
<meta property="og:description" content="30+ free tools: merge, split, compress, convert PDFs, images, videos & text. No signup required." />
|
<meta property="og:description" content="30+ free tools: merge, split, compress, convert PDFs, images, videos & text. No signup required." />
|
||||||
<meta property="og:site_name" content="SaaS-PDF" />
|
<meta property="og:site_name" content="Dociva" />
|
||||||
<meta property="og:locale" content="en_US" />
|
<meta property="og:locale" content="en_US" />
|
||||||
<meta property="og:locale:alternate" content="ar_SA" />
|
<meta property="og:locale:alternate" content="ar_SA" />
|
||||||
<meta property="og:locale:alternate" content="fr_FR" />
|
<meta property="og:locale:alternate" content="fr_FR" />
|
||||||
<meta name="twitter:card" content="summary_large_image" />
|
<meta name="twitter:card" content="summary_large_image" />
|
||||||
<meta name="twitter:title" content="SaaS-PDF — Free Online File Tools" />
|
<meta name="twitter:title" content="Dociva — Free Online File Tools" />
|
||||||
<meta name="twitter:description" content="30+ free tools: merge, split, compress, convert PDFs, images, videos & text. No signup required." />
|
<meta name="twitter:description" content="30+ free tools: merge, split, compress, convert PDFs, images, videos & text. No signup required." />
|
||||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
|
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
|
||||||
<link rel="dns-prefetch" href="https://fonts.gstatic.com" />
|
<link rel="dns-prefetch" href="https://fonts.gstatic.com" />
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Tajawal:wght@300;400;500;700&display=swap" rel="stylesheet" />
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Tajawal:wght@300;400;500;700&display=swap" rel="stylesheet" />
|
||||||
<title>SaaS-PDF — Free Online File Tools</title>
|
<title>Dociva — Free Online File Tools</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="root"></div>
|
<div id="root"></div>
|
||||||
|
|||||||
6
frontend/package-lock.json
generated
6
frontend/package-lock.json
generated
@@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"name": "saas-pdf-frontend",
|
"name": "dociva-frontend",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "saas-pdf-frontend",
|
"name": "dociva-frontend",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^1.7.0",
|
"axios": "^1.7.0",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "saas-pdf-frontend",
|
"name": "dociva-frontend",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -1,7 +1,17 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" fill="none">
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" fill="none">
|
||||||
<rect width="64" height="64" rx="14" fill="#4F46E5"/>
|
<!-- Background: rounded square with gradient -->
|
||||||
<path d="M18 20h20a2 2 0 0 1 2 2v20a2 2 0 0 1-2 2H18a2 2 0 0 1-2-2V22a2 2 0 0 1 2-2z" stroke="#fff" stroke-width="2.5" fill="none"/>
|
<defs>
|
||||||
<path d="M22 28h12M22 33h8" stroke="#fff" stroke-width="2" stroke-linecap="round"/>
|
<linearGradient id="bg" x1="0" y1="0" x2="64" y2="64" gradientUnits="userSpaceOnUse">
|
||||||
<path d="M42 24l6-6M48 18v6h-6" stroke="#93C5FD" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
|
<stop offset="0%" stop-color="#4F46E5"/>
|
||||||
<path d="M42 40l6 6M48 46v-6h-6" stroke="#93C5FD" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
|
<stop offset="100%" stop-color="#7C3AED"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<rect width="64" height="64" rx="14" fill="url(#bg)"/>
|
||||||
|
<!-- Document icon -->
|
||||||
|
<path d="M20 16h14l10 10v22a2 2 0 0 1-2 2H20a2 2 0 0 1-2-2V18a2 2 0 0 1 2-2z" fill="rgba(255,255,255,0.15)" stroke="#fff" stroke-width="2"/>
|
||||||
|
<path d="M34 16v8a2 2 0 0 0 2 2h8" stroke="#fff" stroke-width="2" fill="none"/>
|
||||||
|
<!-- Text lines -->
|
||||||
|
<path d="M24 32h16M24 37h12M24 42h8" stroke="#93C5FD" stroke-width="1.8" stroke-linecap="round"/>
|
||||||
|
<!-- Stylized "D" lettermark -->
|
||||||
|
<text x="39" y="54" font-family="Arial,Helvetica,sans-serif" font-weight="700" font-size="16" fill="#E0E7FF" opacity="0.6">D</text>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 596 B After Width: | Height: | Size: 957 B |
@@ -1,5 +1,5 @@
|
|||||||
/* TEAM */
|
/* TEAM */
|
||||||
Project: SaaS-PDF
|
Project: Dociva
|
||||||
Role: Full-Stack Development
|
Role: Full-Stack Development
|
||||||
Technology: React, TypeScript, Python, Flask, Celery
|
Technology: React, TypeScript, Python, Flask, Celery
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# SaaS-PDF — llms.txt
|
# Dociva — llms.txt
|
||||||
# A description of this site for AI assistants and large language models.
|
# A description of this site for AI assistants and large language models.
|
||||||
|
|
||||||
> SaaS-PDF is a free, online document toolkit that lets users convert,
|
> Dociva is a free, online document toolkit that lets users convert,
|
||||||
> compress, merge, split, edit, and process PDF files, images, and more —
|
> compress, merge, split, edit, and process PDF files, images, and more —
|
||||||
> directly in the browser with no signup required.
|
> directly in the browser with no signup required.
|
||||||
|
|
||||||
|
|||||||
16
frontend/public/logo.svg
Normal file
16
frontend/public/logo.svg
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 48" fill="none">
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="icon-bg" x1="0" y1="0" x2="48" y2="48" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0%" stop-color="#4F46E5"/>
|
||||||
|
<stop offset="100%" stop-color="#7C3AED"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<!-- Icon -->
|
||||||
|
<rect width="42" height="42" rx="10" y="3" fill="url(#icon-bg)"/>
|
||||||
|
<path d="M13 12h10l7 7v15a1.5 1.5 0 0 1-1.5 1.5H13A1.5 1.5 0 0 1 11.5 34V13.5A1.5 1.5 0 0 1 13 12z" fill="rgba(255,255,255,0.15)" stroke="#fff" stroke-width="1.5"/>
|
||||||
|
<path d="M23 12v6a1.5 1.5 0 0 0 1.5 1.5H30" stroke="#fff" stroke-width="1.5" fill="none"/>
|
||||||
|
<path d="M16 24h12M16 28h9M16 32h6" stroke="#93C5FD" stroke-width="1.2" stroke-linecap="round"/>
|
||||||
|
<!-- Wordmark: dociva -->
|
||||||
|
<text x="52" y="33" font-family="Inter,system-ui,Arial,sans-serif" font-weight="700" font-size="28" letter-spacing="-0.5" fill="#1E1B4B">doc</text>
|
||||||
|
<text x="118" y="33" font-family="Inter,system-ui,Arial,sans-serif" font-weight="700" font-size="28" letter-spacing="-0.5" fill="#4F46E5">iva</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -1,4 +1,4 @@
|
|||||||
# robots.txt — SaaS-PDF
|
# robots.txt — Dociva
|
||||||
User-agent: *
|
User-agent: *
|
||||||
Allow: /
|
Allow: /
|
||||||
Disallow: /api/
|
Disallow: /api/
|
||||||
@@ -7,7 +7,7 @@ Disallow: /forgot-password
|
|||||||
Disallow: /reset-password
|
Disallow: /reset-password
|
||||||
|
|
||||||
# Sitemaps
|
# Sitemaps
|
||||||
Sitemap: https://saas-pdf.com/sitemap.xml
|
Sitemap: https://dociva.io/sitemap.xml
|
||||||
|
|
||||||
# AI/LLM discoverability
|
# AI/LLM discoverability
|
||||||
# See also: /llms.txt
|
# See also: /llms.txt
|
||||||
|
|||||||
@@ -1,43 +1,43 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/</loc>
|
<loc>https://dociva.io/</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>daily</changefreq>
|
<changefreq>daily</changefreq>
|
||||||
<priority>1.0</priority>
|
<priority>1.0</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/about</loc>
|
<loc>https://dociva.io/about</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.4</priority>
|
<priority>0.4</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/contact</loc>
|
<loc>https://dociva.io/contact</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.4</priority>
|
<priority>0.4</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/privacy</loc>
|
<loc>https://dociva.io/privacy</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>yearly</changefreq>
|
<changefreq>yearly</changefreq>
|
||||||
<priority>0.3</priority>
|
<priority>0.3</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/terms</loc>
|
<loc>https://dociva.io/terms</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>yearly</changefreq>
|
<changefreq>yearly</changefreq>
|
||||||
<priority>0.3</priority>
|
<priority>0.3</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/pricing</loc>
|
<loc>https://dociva.io/pricing</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.7</priority>
|
<priority>0.7</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/blog</loc>
|
<loc>https://dociva.io/blog</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.6</priority>
|
<priority>0.6</priority>
|
||||||
@@ -45,109 +45,109 @@
|
|||||||
|
|
||||||
<!-- PDF Tools -->
|
<!-- PDF Tools -->
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/pdf-to-word</loc>
|
<loc>https://dociva.io/tools/pdf-to-word</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.9</priority>
|
<priority>0.9</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/word-to-pdf</loc>
|
<loc>https://dociva.io/tools/word-to-pdf</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.9</priority>
|
<priority>0.9</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/compress-pdf</loc>
|
<loc>https://dociva.io/tools/compress-pdf</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.9</priority>
|
<priority>0.9</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/merge-pdf</loc>
|
<loc>https://dociva.io/tools/merge-pdf</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.9</priority>
|
<priority>0.9</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/split-pdf</loc>
|
<loc>https://dociva.io/tools/split-pdf</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.8</priority>
|
<priority>0.8</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/rotate-pdf</loc>
|
<loc>https://dociva.io/tools/rotate-pdf</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.7</priority>
|
<priority>0.7</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/pdf-to-images</loc>
|
<loc>https://dociva.io/tools/pdf-to-images</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.8</priority>
|
<priority>0.8</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/images-to-pdf</loc>
|
<loc>https://dociva.io/tools/images-to-pdf</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.8</priority>
|
<priority>0.8</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/watermark-pdf</loc>
|
<loc>https://dociva.io/tools/watermark-pdf</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.7</priority>
|
<priority>0.7</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/remove-watermark-pdf</loc>
|
<loc>https://dociva.io/tools/remove-watermark-pdf</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.7</priority>
|
<priority>0.7</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/protect-pdf</loc>
|
<loc>https://dociva.io/tools/protect-pdf</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.8</priority>
|
<priority>0.8</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/unlock-pdf</loc>
|
<loc>https://dociva.io/tools/unlock-pdf</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.8</priority>
|
<priority>0.8</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/page-numbers</loc>
|
<loc>https://dociva.io/tools/page-numbers</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.7</priority>
|
<priority>0.7</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/reorder-pdf</loc>
|
<loc>https://dociva.io/tools/reorder-pdf</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.7</priority>
|
<priority>0.7</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/extract-pages</loc>
|
<loc>https://dociva.io/tools/extract-pages</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.7</priority>
|
<priority>0.7</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/pdf-editor</loc>
|
<loc>https://dociva.io/tools/pdf-editor</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.8</priority>
|
<priority>0.8</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/pdf-flowchart</loc>
|
<loc>https://dociva.io/tools/pdf-flowchart</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.7</priority>
|
<priority>0.7</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/pdf-to-excel</loc>
|
<loc>https://dociva.io/tools/pdf-to-excel</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.8</priority>
|
<priority>0.8</priority>
|
||||||
@@ -155,25 +155,25 @@
|
|||||||
|
|
||||||
<!-- Image Tools -->
|
<!-- Image Tools -->
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/image-converter</loc>
|
<loc>https://dociva.io/tools/image-converter</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.8</priority>
|
<priority>0.8</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/image-resize</loc>
|
<loc>https://dociva.io/tools/image-resize</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.8</priority>
|
<priority>0.8</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/compress-image</loc>
|
<loc>https://dociva.io/tools/compress-image</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.8</priority>
|
<priority>0.8</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/remove-background</loc>
|
<loc>https://dociva.io/tools/remove-background</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.8</priority>
|
<priority>0.8</priority>
|
||||||
@@ -181,31 +181,31 @@
|
|||||||
|
|
||||||
<!-- AI Tools -->
|
<!-- AI Tools -->
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/ocr</loc>
|
<loc>https://dociva.io/tools/ocr</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.8</priority>
|
<priority>0.8</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/chat-pdf</loc>
|
<loc>https://dociva.io/tools/chat-pdf</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.8</priority>
|
<priority>0.8</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/summarize-pdf</loc>
|
<loc>https://dociva.io/tools/summarize-pdf</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.8</priority>
|
<priority>0.8</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/translate-pdf</loc>
|
<loc>https://dociva.io/tools/translate-pdf</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.8</priority>
|
<priority>0.8</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/extract-tables</loc>
|
<loc>https://dociva.io/tools/extract-tables</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.8</priority>
|
<priority>0.8</priority>
|
||||||
@@ -213,31 +213,31 @@
|
|||||||
|
|
||||||
<!-- Utility Tools -->
|
<!-- Utility Tools -->
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/html-to-pdf</loc>
|
<loc>https://dociva.io/tools/html-to-pdf</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.7</priority>
|
<priority>0.7</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/qr-code</loc>
|
<loc>https://dociva.io/tools/qr-code</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.7</priority>
|
<priority>0.7</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/video-to-gif</loc>
|
<loc>https://dociva.io/tools/video-to-gif</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.7</priority>
|
<priority>0.7</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/word-counter</loc>
|
<loc>https://dociva.io/tools/word-counter</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.6</priority>
|
<priority>0.6</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://saas-pdf.com/tools/text-cleaner</loc>
|
<loc>https://dociva.io/tools/text-cleaner</loc>
|
||||||
<lastmod>2026-03-14</lastmod>
|
<lastmod>2026-03-14</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.6</priority>
|
<priority>0.6</priority>
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ interface AssistantStorageState {
|
|||||||
messages: AssistantMessage[];
|
messages: AssistantMessage[];
|
||||||
}
|
}
|
||||||
|
|
||||||
const STORAGE_KEY = 'saaspdf:site-assistant:v1';
|
const STORAGE_KEY = 'dociva:site-assistant:v1';
|
||||||
const MAX_STORED_MESSAGES = 20;
|
const MAX_STORED_MESSAGES = 20;
|
||||||
const ASSISTANT_ENABLED = import.meta.env.VITE_SITE_ASSISTANT_ENABLED !== 'false';
|
const ASSISTANT_ENABLED = import.meta.env.VITE_SITE_ASSISTANT_ENABLED !== 'false';
|
||||||
|
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ import { Helmet } from 'react-helmet-async';
|
|||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { buildLanguageAlternates, getOgLocale } from '@/utils/seo';
|
import { buildLanguageAlternates, getOgLocale } from '@/utils/seo';
|
||||||
|
|
||||||
const SITE_NAME = 'SaaS-PDF';
|
const SITE_NAME = 'Dociva';
|
||||||
|
|
||||||
interface SEOHeadProps {
|
interface SEOHeadProps {
|
||||||
/** Page title (will be appended with " — SaaS-PDF") */
|
/** Page title (will be appended with " — Dociva") */
|
||||||
title: string;
|
title: string;
|
||||||
/** Meta description */
|
/** Meta description */
|
||||||
description: string;
|
description: string;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"common": {
|
"common": {
|
||||||
"appName": "SaaS-PDF",
|
"appName": "Dociva",
|
||||||
"tagline": "أدوات ملفات مجانية على الإنترنت",
|
"tagline": "أدوات ملفات مجانية على الإنترنت",
|
||||||
"upload": "رفع ملف",
|
"upload": "رفع ملف",
|
||||||
"download": "تحميل",
|
"download": "تحميل",
|
||||||
@@ -78,7 +78,7 @@
|
|||||||
"thinking": "جارٍ التفكير...",
|
"thinking": "جارٍ التفكير...",
|
||||||
"unavailable": "المساعد غير متاح مؤقتاً. يرجى المحاولة بعد قليل.",
|
"unavailable": "المساعد غير متاح مؤقتاً. يرجى المحاولة بعد قليل.",
|
||||||
"close": "إغلاق المساعد",
|
"close": "إغلاق المساعد",
|
||||||
"fabTitle": "اسأل SaaS-PDF",
|
"fabTitle": "اسأل Dociva",
|
||||||
"fabSubtitle": "مساعدة ذكية عبر جميع الأدوات",
|
"fabSubtitle": "مساعدة ذكية عبر جميع الأدوات",
|
||||||
"prompts": {
|
"prompts": {
|
||||||
"currentTool": "كيف أستخدم {{tool}}؟",
|
"currentTool": "كيف أستخدم {{tool}}؟",
|
||||||
@@ -155,10 +155,10 @@
|
|||||||
},
|
},
|
||||||
"pages": {
|
"pages": {
|
||||||
"about": {
|
"about": {
|
||||||
"metaDescription": "تعرّف على SaaS-PDF — أدوات ملفات مجانية وسريعة وآمنة عبر الإنترنت لملفات PDF والصور والفيديو والنصوص. لا حاجة للتسجيل.",
|
"metaDescription": "تعرّف على Dociva — أدوات ملفات مجانية وسريعة وآمنة عبر الإنترنت لملفات PDF والصور والفيديو والنصوص. لا حاجة للتسجيل.",
|
||||||
"title": "عن SaaS-PDF",
|
"title": "عن Dociva",
|
||||||
"missionTitle": "مهمتنا",
|
"missionTitle": "مهمتنا",
|
||||||
"missionText": "تم بناء SaaS-PDF لجعل أدوات الملفات الاحترافية متاحة للجميع — مجاناً. نؤمن بأن تحويل المستندات وضغطها وتعديلها يجب أن يكون بسيطاً وسريعاً وخاصاً. لا تسجيل، لا رسوم خفية، لا برامج للتثبيت.",
|
"missionText": "تم بناء Dociva لجعل أدوات الملفات الاحترافية متاحة للجميع — مجاناً. نؤمن بأن تحويل المستندات وضغطها وتعديلها يجب أن يكون بسيطاً وسريعاً وخاصاً. لا تسجيل، لا رسوم خفية، لا برامج للتثبيت.",
|
||||||
"technologyTitle": "التقنية",
|
"technologyTitle": "التقنية",
|
||||||
"technologyText": "منصتنا مدعومة ببنية تحتية سحابية حديثة مصممة للسرعة والموثوقية. تتم معالجة الملفات على الخادم باستخدام مكتبات مفتوحة المصدر رائدة في الصناعة، مما يضمن تحويلات دقيقة ومخرجات عالية الجودة في كل مرة. تستفيد أدواتنا المدعومة بالذكاء الاصطناعي من نماذج التعلم الآلي المتقدمة لتحليل المستندات والترجمة والتلخيص بذكاء.",
|
"technologyText": "منصتنا مدعومة ببنية تحتية سحابية حديثة مصممة للسرعة والموثوقية. تتم معالجة الملفات على الخادم باستخدام مكتبات مفتوحة المصدر رائدة في الصناعة، مما يضمن تحويلات دقيقة ومخرجات عالية الجودة في كل مرة. تستفيد أدواتنا المدعومة بالذكاء الاصطناعي من نماذج التعلم الآلي المتقدمة لتحليل المستندات والترجمة والتلخيص بذكاء.",
|
||||||
"securityTitle": "الأمان",
|
"securityTitle": "الأمان",
|
||||||
@@ -175,7 +175,7 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"contact": {
|
"contact": {
|
||||||
"metaDescription": "تواصل مع فريق SaaS-PDF. أبلغ عن خطأ أو اطلب ميزة جديدة أو أرسل لنا رسالة.",
|
"metaDescription": "تواصل مع فريق Dociva. أبلغ عن خطأ أو اطلب ميزة جديدة أو أرسل لنا رسالة.",
|
||||||
"title": "اتصل بنا",
|
"title": "اتصل بنا",
|
||||||
"subtitle": "لديك سؤال أو وجدت خطأ أو تريد طلب ميزة جديدة؟ يسعدنا سماع رأيك.",
|
"subtitle": "لديك سؤال أو وجدت خطأ أو تريد طلب ميزة جديدة؟ يسعدنا سماع رأيك.",
|
||||||
"formTitle": "أرسل لنا رسالة",
|
"formTitle": "أرسل لنا رسالة",
|
||||||
@@ -196,7 +196,7 @@
|
|||||||
"responseTime": "نرد عادةً خلال 24-48 ساعة."
|
"responseTime": "نرد عادةً خلال 24-48 ساعة."
|
||||||
},
|
},
|
||||||
"privacy": {
|
"privacy": {
|
||||||
"metaDescription": "سياسة الخصوصية لـ SaaS-PDF. تعرّف على كيفية تعاملنا مع ملفاتك وبياناتك بشفافية كاملة.",
|
"metaDescription": "سياسة الخصوصية لـ Dociva. تعرّف على كيفية تعاملنا مع ملفاتك وبياناتك بشفافية كاملة.",
|
||||||
"title": "سياسة الخصوصية",
|
"title": "سياسة الخصوصية",
|
||||||
"lastUpdated": "آخر تحديث: {{date}}",
|
"lastUpdated": "آخر تحديث: {{date}}",
|
||||||
"dataCollectionTitle": "1. جمع البيانات",
|
"dataCollectionTitle": "1. جمع البيانات",
|
||||||
@@ -226,13 +226,13 @@
|
|||||||
"contactText": "أسئلة حول هذه السياسة؟ تواصل معنا على"
|
"contactText": "أسئلة حول هذه السياسة؟ تواصل معنا على"
|
||||||
},
|
},
|
||||||
"terms": {
|
"terms": {
|
||||||
"metaDescription": "شروط استخدام SaaS-PDF. تعرّف على القواعد والإرشادات لاستخدام أدواتنا المجانية عبر الإنترنت.",
|
"metaDescription": "شروط استخدام Dociva. تعرّف على القواعد والإرشادات لاستخدام أدواتنا المجانية عبر الإنترنت.",
|
||||||
"title": "شروط الاستخدام",
|
"title": "شروط الاستخدام",
|
||||||
"lastUpdated": "آخر تحديث: {{date}}",
|
"lastUpdated": "آخر تحديث: {{date}}",
|
||||||
"acceptanceTitle": "1. قبول الشروط",
|
"acceptanceTitle": "1. قبول الشروط",
|
||||||
"acceptanceText": "باستخدامك لموقع SaaS-PDF، فإنك توافق على الالتزام بشروط الاستخدام هذه. إذا كنت لا توافق، يرجى التوقف عن الاستخدام فوراً.",
|
"acceptanceText": "باستخدامك لموقع Dociva، فإنك توافق على الالتزام بشروط الاستخدام هذه. إذا كنت لا توافق، يرجى التوقف عن الاستخدام فوراً.",
|
||||||
"serviceTitle": "2. وصف الخدمة",
|
"serviceTitle": "2. وصف الخدمة",
|
||||||
"serviceText": "يوفر SaaS-PDF أدوات مجانية عبر الإنترنت لتحويل الملفات وضغطها ومعالجتها. يتم تقديم الخدمة \"كما هي\" بدون ضمانات من أي نوع.",
|
"serviceText": "يوفر Dociva أدوات مجانية عبر الإنترنت لتحويل الملفات وضغطها ومعالجتها. يتم تقديم الخدمة \"كما هي\" بدون ضمانات من أي نوع.",
|
||||||
"useTitle": "3. الاستخدام المقبول",
|
"useTitle": "3. الاستخدام المقبول",
|
||||||
"useItems": [
|
"useItems": [
|
||||||
"يجب أن ترفع فقط ملفات لديك الحق في معالجتها.",
|
"يجب أن ترفع فقط ملفات لديك الحق في معالجتها.",
|
||||||
@@ -248,9 +248,9 @@
|
|||||||
"لا نضمن الحفاظ على أي محتوى مرفوع بعد فترة المعالجة."
|
"لا نضمن الحفاظ على أي محتوى مرفوع بعد فترة المعالجة."
|
||||||
],
|
],
|
||||||
"liabilityTitle": "5. تحديد المسؤولية",
|
"liabilityTitle": "5. تحديد المسؤولية",
|
||||||
"liabilityText": "لن يكون SaaS-PDF مسؤولاً عن أي أضرار مباشرة أو غير مباشرة أو عرضية أو تبعية ناتجة عن استخدام الخدمة أو عدم القدرة على استخدامها. استخدام الخدمة على مسؤوليتك.",
|
"liabilityText": "لن يكون Dociva مسؤولاً عن أي أضرار مباشرة أو غير مباشرة أو عرضية أو تبعية ناتجة عن استخدام الخدمة أو عدم القدرة على استخدامها. استخدام الخدمة على مسؤوليتك.",
|
||||||
"ipTitle": "6. الملكية الفكرية",
|
"ipTitle": "6. الملكية الفكرية",
|
||||||
"ipText": "جميع الأدوات والواجهات والمحتوى على SaaS-PDF هي ملكية فكرية لمشغلي الخدمة. تحتفظ بملكية كاملة لجميع الملفات التي ترفعها وتعالجها.",
|
"ipText": "جميع الأدوات والواجهات والمحتوى على Dociva هي ملكية فكرية لمشغلي الخدمة. تحتفظ بملكية كاملة لجميع الملفات التي ترفعها وتعالجها.",
|
||||||
"changesTitle": "7. التغييرات على الشروط",
|
"changesTitle": "7. التغييرات على الشروط",
|
||||||
"changesText": "نحتفظ بالحق في تعديل هذه الشروط في أي وقت. الاستمرار في استخدام الخدمة بعد التغييرات يعني قبول الشروط المحدثة.",
|
"changesText": "نحتفظ بالحق في تعديل هذه الشروط في أي وقت. الاستمرار في استخدام الخدمة بعد التغييرات يعني قبول الشروط المحدثة.",
|
||||||
"contactTitle": "8. الاتصال",
|
"contactTitle": "8. الاتصال",
|
||||||
@@ -285,8 +285,8 @@
|
|||||||
"totalRatings": "تقييم"
|
"totalRatings": "تقييم"
|
||||||
},
|
},
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"metaTitle": "الأسعار — SaaS-PDF",
|
"metaTitle": "الأسعار — Dociva",
|
||||||
"metaDescription": "قارن بين الخطة المجانية والاحترافية لـ SaaS-PDF. استخدم أكثر من 30 أداة مجانًا أو قم بالترقية للمعالجة غير المحدودة.",
|
"metaDescription": "قارن بين الخطة المجانية والاحترافية لـ Dociva. استخدم أكثر من 30 أداة مجانًا أو قم بالترقية للمعالجة غير المحدودة.",
|
||||||
"title": "الخطط والأسعار",
|
"title": "الخطط والأسعار",
|
||||||
"subtitle": "ابدأ مجانًا وقم بالترقية عندما تحتاج المزيد.",
|
"subtitle": "ابدأ مجانًا وقم بالترقية عندما تحتاج المزيد.",
|
||||||
"free": "مجاني",
|
"free": "مجاني",
|
||||||
@@ -338,9 +338,9 @@
|
|||||||
"trustApiDesc": "يمكن لمساحات العمل الاحترافية إنشاء مفاتيح API وربط الأدوات نفسها مع الأتمتة الداخلية أو تدفقات العملاء."
|
"trustApiDesc": "يمكن لمساحات العمل الاحترافية إنشاء مفاتيح API وربط الأدوات نفسها مع الأتمتة الداخلية أو تدفقات العملاء."
|
||||||
},
|
},
|
||||||
"developers": {
|
"developers": {
|
||||||
"metaDescription": "استكشف بوابة مطوري SaaS-PDF، وتدفق API غير المتزامن، والنقاط الجاهزة لأتمتة المستندات.",
|
"metaDescription": "استكشف بوابة مطوري Dociva، وتدفق API غير المتزامن، والنقاط الجاهزة لأتمتة المستندات.",
|
||||||
"badge": "بوابة المطورين",
|
"badge": "بوابة المطورين",
|
||||||
"title": "ابنِ تدفقات المستندات فوق واجهة SaaS-PDF البرمجية",
|
"title": "ابنِ تدفقات المستندات فوق واجهة Dociva البرمجية",
|
||||||
"subtitle": "استخدم نقاط التحويل والضغط وOCR والذكاء الاصطناعي نفسها الموجودة خلف التطبيق داخل أنظمتك الخاصة.",
|
"subtitle": "استخدم نقاط التحويل والضغط وOCR والذكاء الاصطناعي نفسها الموجودة خلف التطبيق داخل أنظمتك الخاصة.",
|
||||||
"getApiKey": "احصل على مفتاح API",
|
"getApiKey": "احصل على مفتاح API",
|
||||||
"comparePlans": "قارن الخطط",
|
"comparePlans": "قارن الخطط",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"common": {
|
"common": {
|
||||||
"appName": "SaaS-PDF",
|
"appName": "Dociva",
|
||||||
"tagline": "Free Online File Tools",
|
"tagline": "Free Online File Tools",
|
||||||
"upload": "Upload File",
|
"upload": "Upload File",
|
||||||
"download": "Download",
|
"download": "Download",
|
||||||
@@ -78,7 +78,7 @@
|
|||||||
"thinking": "Thinking...",
|
"thinking": "Thinking...",
|
||||||
"unavailable": "The assistant is temporarily unavailable. Please try again in a moment.",
|
"unavailable": "The assistant is temporarily unavailable. Please try again in a moment.",
|
||||||
"close": "Close assistant",
|
"close": "Close assistant",
|
||||||
"fabTitle": "Ask SaaS-PDF",
|
"fabTitle": "Ask Dociva",
|
||||||
"fabSubtitle": "Smart help across all tools",
|
"fabSubtitle": "Smart help across all tools",
|
||||||
"prompts": {
|
"prompts": {
|
||||||
"currentTool": "How do I use {{tool}}?",
|
"currentTool": "How do I use {{tool}}?",
|
||||||
@@ -155,10 +155,10 @@
|
|||||||
},
|
},
|
||||||
"pages": {
|
"pages": {
|
||||||
"about": {
|
"about": {
|
||||||
"metaDescription": "Learn about SaaS-PDF — free, fast, and secure online file tools for PDFs, images, video, and text. No registration required.",
|
"metaDescription": "Learn about Dociva — free, fast, and secure online file tools for PDFs, images, video, and text. No registration required.",
|
||||||
"title": "About SaaS-PDF",
|
"title": "About Dociva",
|
||||||
"missionTitle": "Our Mission",
|
"missionTitle": "Our Mission",
|
||||||
"missionText": "SaaS-PDF was built to make professional-grade file tools accessible to everyone — for free. We believe that converting, compressing, and editing documents should be simple, fast, and private. No sign-ups, no hidden fees, no software to install.",
|
"missionText": "Dociva was built to make professional-grade file tools accessible to everyone — for free. We believe that converting, compressing, and editing documents should be simple, fast, and private. No sign-ups, no hidden fees, no software to install.",
|
||||||
"technologyTitle": "Technology",
|
"technologyTitle": "Technology",
|
||||||
"technologyText": "Our platform is powered by modern cloud infrastructure designed for speed and reliability. Files are processed server-side using industry-leading open-source libraries, ensuring accurate conversions and high-quality output every time. Our AI-powered tools leverage advanced machine learning models for intelligent document analysis, translation, and summarization.",
|
"technologyText": "Our platform is powered by modern cloud infrastructure designed for speed and reliability. Files are processed server-side using industry-leading open-source libraries, ensuring accurate conversions and high-quality output every time. Our AI-powered tools leverage advanced machine learning models for intelligent document analysis, translation, and summarization.",
|
||||||
"securityTitle": "Security",
|
"securityTitle": "Security",
|
||||||
@@ -175,7 +175,7 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"contact": {
|
"contact": {
|
||||||
"metaDescription": "Contact the SaaS-PDF team. Report bugs, request features, or send us a message.",
|
"metaDescription": "Contact the Dociva team. Report bugs, request features, or send us a message.",
|
||||||
"title": "Contact Us",
|
"title": "Contact Us",
|
||||||
"subtitle": "Have a question, found a bug, or want to request a feature? We'd love to hear from you.",
|
"subtitle": "Have a question, found a bug, or want to request a feature? We'd love to hear from you.",
|
||||||
"formTitle": "Send Us a Message",
|
"formTitle": "Send Us a Message",
|
||||||
@@ -196,7 +196,7 @@
|
|||||||
"responseTime": "We typically respond within 24–48 hours."
|
"responseTime": "We typically respond within 24–48 hours."
|
||||||
},
|
},
|
||||||
"privacy": {
|
"privacy": {
|
||||||
"metaDescription": "Privacy policy for SaaS-PDF. Learn how we handle your files and data with full transparency.",
|
"metaDescription": "Privacy policy for Dociva. Learn how we handle your files and data with full transparency.",
|
||||||
"title": "Privacy Policy",
|
"title": "Privacy Policy",
|
||||||
"lastUpdated": "Last updated: {{date}}",
|
"lastUpdated": "Last updated: {{date}}",
|
||||||
"dataCollectionTitle": "1. Data Collection",
|
"dataCollectionTitle": "1. Data Collection",
|
||||||
@@ -226,13 +226,13 @@
|
|||||||
"contactText": "Questions about this policy? Contact us at"
|
"contactText": "Questions about this policy? Contact us at"
|
||||||
},
|
},
|
||||||
"terms": {
|
"terms": {
|
||||||
"metaDescription": "Terms of service for SaaS-PDF. Understand the rules and guidelines for using our free online tools.",
|
"metaDescription": "Terms of service for Dociva. Understand the rules and guidelines for using our free online tools.",
|
||||||
"title": "Terms of Service",
|
"title": "Terms of Service",
|
||||||
"lastUpdated": "Last updated: {{date}}",
|
"lastUpdated": "Last updated: {{date}}",
|
||||||
"acceptanceTitle": "1. Acceptance of Terms",
|
"acceptanceTitle": "1. Acceptance of Terms",
|
||||||
"acceptanceText": "By accessing and using SaaS-PDF, you agree to be bound by these Terms of Service. If you do not agree, please discontinue use immediately.",
|
"acceptanceText": "By accessing and using Dociva, you agree to be bound by these Terms of Service. If you do not agree, please discontinue use immediately.",
|
||||||
"serviceTitle": "2. Service Description",
|
"serviceTitle": "2. Service Description",
|
||||||
"serviceText": "SaaS-PDF provides free online tools for file conversion, compression, and transformation. The service is provided \"as is\" without warranties of any kind.",
|
"serviceText": "Dociva provides free online tools for file conversion, compression, and transformation. The service is provided \"as is\" without warranties of any kind.",
|
||||||
"useTitle": "3. Acceptable Use",
|
"useTitle": "3. Acceptable Use",
|
||||||
"useItems": [
|
"useItems": [
|
||||||
"You may only upload files that you have the right to process.",
|
"You may only upload files that you have the right to process.",
|
||||||
@@ -248,9 +248,9 @@
|
|||||||
"We do not guarantee the preservation of any uploaded content beyond the processing window."
|
"We do not guarantee the preservation of any uploaded content beyond the processing window."
|
||||||
],
|
],
|
||||||
"liabilityTitle": "5. Limitation of Liability",
|
"liabilityTitle": "5. Limitation of Liability",
|
||||||
"liabilityText": "SaaS-PDF shall not be liable for any direct, indirect, incidental, or consequential damages resulting from the use or inability to use the service. Use of the service is at your own risk.",
|
"liabilityText": "Dociva shall not be liable for any direct, indirect, incidental, or consequential damages resulting from the use or inability to use the service. Use of the service is at your own risk.",
|
||||||
"ipTitle": "6. Intellectual Property",
|
"ipTitle": "6. Intellectual Property",
|
||||||
"ipText": "All tools, interfaces, and content on SaaS-PDF are the intellectual property of the service operators. You retain full ownership of all files you upload and process.",
|
"ipText": "All tools, interfaces, and content on Dociva are the intellectual property of the service operators. You retain full ownership of all files you upload and process.",
|
||||||
"changesTitle": "7. Changes to Terms",
|
"changesTitle": "7. Changes to Terms",
|
||||||
"changesText": "We reserve the right to modify these terms at any time. Continued use of the service after changes constitutes acceptance of the updated terms.",
|
"changesText": "We reserve the right to modify these terms at any time. Continued use of the service after changes constitutes acceptance of the updated terms.",
|
||||||
"contactTitle": "8. Contact",
|
"contactTitle": "8. Contact",
|
||||||
@@ -285,8 +285,8 @@
|
|||||||
"totalRatings": "ratings"
|
"totalRatings": "ratings"
|
||||||
},
|
},
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"metaTitle": "Pricing — SaaS-PDF",
|
"metaTitle": "Pricing — Dociva",
|
||||||
"metaDescription": "Compare free and pro plans for SaaS-PDF. Access 30+ tools for free, or upgrade for unlimited processing.",
|
"metaDescription": "Compare free and pro plans for Dociva. Access 30+ tools for free, or upgrade for unlimited processing.",
|
||||||
"title": "Plans & Pricing",
|
"title": "Plans & Pricing",
|
||||||
"subtitle": "Start free and upgrade when you need more.",
|
"subtitle": "Start free and upgrade when you need more.",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
@@ -338,9 +338,9 @@
|
|||||||
"trustApiDesc": "Pro workspaces can generate API keys and connect the same tools to internal automations and client flows."
|
"trustApiDesc": "Pro workspaces can generate API keys and connect the same tools to internal automations and client flows."
|
||||||
},
|
},
|
||||||
"developers": {
|
"developers": {
|
||||||
"metaDescription": "Explore the SaaS-PDF developer portal, async API flow, and production-ready endpoints for document automation.",
|
"metaDescription": "Explore the Dociva developer portal, async API flow, and production-ready endpoints for document automation.",
|
||||||
"badge": "Developer Portal",
|
"badge": "Developer Portal",
|
||||||
"title": "Build document workflows on top of the SaaS-PDF API",
|
"title": "Build document workflows on top of the Dociva API",
|
||||||
"subtitle": "Use the same conversion, compression, OCR, and AI endpoints behind the web app inside your own systems.",
|
"subtitle": "Use the same conversion, compression, OCR, and AI endpoints behind the web app inside your own systems.",
|
||||||
"getApiKey": "Get an API key",
|
"getApiKey": "Get an API key",
|
||||||
"comparePlans": "Compare plans",
|
"comparePlans": "Compare plans",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"common": {
|
"common": {
|
||||||
"appName": "SaaS-PDF",
|
"appName": "Dociva",
|
||||||
"tagline": "Outils de fichiers en ligne gratuits",
|
"tagline": "Outils de fichiers en ligne gratuits",
|
||||||
"upload": "Télécharger un fichier",
|
"upload": "Télécharger un fichier",
|
||||||
"download": "Télécharger",
|
"download": "Télécharger",
|
||||||
@@ -78,7 +78,7 @@
|
|||||||
"thinking": "Réflexion en cours...",
|
"thinking": "Réflexion en cours...",
|
||||||
"unavailable": "L'assistant est temporairement indisponible. Veuillez réessayer dans un instant.",
|
"unavailable": "L'assistant est temporairement indisponible. Veuillez réessayer dans un instant.",
|
||||||
"close": "Fermer l'assistant",
|
"close": "Fermer l'assistant",
|
||||||
"fabTitle": "Demander à SaaS-PDF",
|
"fabTitle": "Demander à Dociva",
|
||||||
"fabSubtitle": "Aide intelligente sur tous les outils",
|
"fabSubtitle": "Aide intelligente sur tous les outils",
|
||||||
"prompts": {
|
"prompts": {
|
||||||
"currentTool": "Comment utiliser {{tool}} ?",
|
"currentTool": "Comment utiliser {{tool}} ?",
|
||||||
@@ -155,10 +155,10 @@
|
|||||||
},
|
},
|
||||||
"pages": {
|
"pages": {
|
||||||
"about": {
|
"about": {
|
||||||
"metaDescription": "Découvrez SaaS-PDF — outils en ligne gratuits, rapides et sécurisés pour les PDF, images, vidéos et textes. Aucune inscription requise.",
|
"metaDescription": "Découvrez Dociva — outils en ligne gratuits, rapides et sécurisés pour les PDF, images, vidéos et textes. Aucune inscription requise.",
|
||||||
"title": "À propos de SaaS-PDF",
|
"title": "À propos de Dociva",
|
||||||
"missionTitle": "Notre mission",
|
"missionTitle": "Notre mission",
|
||||||
"missionText": "SaaS-PDF a été créé pour rendre les outils de fichiers professionnels accessibles à tous — gratuitement. Nous croyons que la conversion, la compression et l'édition de documents doivent être simples, rapides et privées. Pas d'inscription, pas de frais cachés, pas de logiciel à installer.",
|
"missionText": "Dociva a été créé pour rendre les outils de fichiers professionnels accessibles à tous — gratuitement. Nous croyons que la conversion, la compression et l'édition de documents doivent être simples, rapides et privées. Pas d'inscription, pas de frais cachés, pas de logiciel à installer.",
|
||||||
"technologyTitle": "Technologie",
|
"technologyTitle": "Technologie",
|
||||||
"technologyText": "Notre plateforme est alimentée par une infrastructure cloud moderne conçue pour la vitesse et la fiabilité. Les fichiers sont traités côté serveur à l'aide de bibliothèques open source de référence, garantissant des conversions précises et des résultats de haute qualité à chaque fois. Nos outils alimentés par l'IA exploitent des modèles d'apprentissage automatique avancés pour l'analyse, la traduction et le résumé intelligents de documents.",
|
"technologyText": "Notre plateforme est alimentée par une infrastructure cloud moderne conçue pour la vitesse et la fiabilité. Les fichiers sont traités côté serveur à l'aide de bibliothèques open source de référence, garantissant des conversions précises et des résultats de haute qualité à chaque fois. Nos outils alimentés par l'IA exploitent des modèles d'apprentissage automatique avancés pour l'analyse, la traduction et le résumé intelligents de documents.",
|
||||||
"securityTitle": "Sécurité",
|
"securityTitle": "Sécurité",
|
||||||
@@ -175,7 +175,7 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"contact": {
|
"contact": {
|
||||||
"metaDescription": "Contactez l'équipe SaaS-PDF. Signalez un bug, demandez une fonctionnalité ou envoyez-nous un message.",
|
"metaDescription": "Contactez l'équipe Dociva. Signalez un bug, demandez une fonctionnalité ou envoyez-nous un message.",
|
||||||
"title": "Nous contacter",
|
"title": "Nous contacter",
|
||||||
"subtitle": "Vous avez une question, trouvé un bug ou souhaitez demander une fonctionnalité ? Nous serions ravis de vous entendre.",
|
"subtitle": "Vous avez une question, trouvé un bug ou souhaitez demander une fonctionnalité ? Nous serions ravis de vous entendre.",
|
||||||
"formTitle": "Envoyez-nous un message",
|
"formTitle": "Envoyez-nous un message",
|
||||||
@@ -196,7 +196,7 @@
|
|||||||
"responseTime": "Nous répondons généralement sous 24 à 48 heures."
|
"responseTime": "Nous répondons généralement sous 24 à 48 heures."
|
||||||
},
|
},
|
||||||
"privacy": {
|
"privacy": {
|
||||||
"metaDescription": "Politique de confidentialité de SaaS-PDF. Découvrez comment nous gérons vos fichiers et données en toute transparence.",
|
"metaDescription": "Politique de confidentialité de Dociva. Découvrez comment nous gérons vos fichiers et données en toute transparence.",
|
||||||
"title": "Politique de confidentialité",
|
"title": "Politique de confidentialité",
|
||||||
"lastUpdated": "Dernière mise à jour : {{date}}",
|
"lastUpdated": "Dernière mise à jour : {{date}}",
|
||||||
"dataCollectionTitle": "1. Collecte de données",
|
"dataCollectionTitle": "1. Collecte de données",
|
||||||
@@ -226,13 +226,13 @@
|
|||||||
"contactText": "Des questions sur cette politique ? Contactez-nous à"
|
"contactText": "Des questions sur cette politique ? Contactez-nous à"
|
||||||
},
|
},
|
||||||
"terms": {
|
"terms": {
|
||||||
"metaDescription": "Conditions d'utilisation de SaaS-PDF. Comprenez les règles et directives pour utiliser nos outils gratuits en ligne.",
|
"metaDescription": "Conditions d'utilisation de Dociva. Comprenez les règles et directives pour utiliser nos outils gratuits en ligne.",
|
||||||
"title": "Conditions d'utilisation",
|
"title": "Conditions d'utilisation",
|
||||||
"lastUpdated": "Dernière mise à jour : {{date}}",
|
"lastUpdated": "Dernière mise à jour : {{date}}",
|
||||||
"acceptanceTitle": "1. Acceptation des conditions",
|
"acceptanceTitle": "1. Acceptation des conditions",
|
||||||
"acceptanceText": "En accédant et en utilisant SaaS-PDF, vous acceptez d'être lié par ces conditions d'utilisation. Si vous n'êtes pas d'accord, veuillez cesser d'utiliser le service immédiatement.",
|
"acceptanceText": "En accédant et en utilisant Dociva, vous acceptez d'être lié par ces conditions d'utilisation. Si vous n'êtes pas d'accord, veuillez cesser d'utiliser le service immédiatement.",
|
||||||
"serviceTitle": "2. Description du service",
|
"serviceTitle": "2. Description du service",
|
||||||
"serviceText": "SaaS-PDF fournit des outils gratuits en ligne pour la conversion, la compression et la transformation de fichiers. Le service est fourni \"tel quel\" sans garantie d'aucune sorte.",
|
"serviceText": "Dociva fournit des outils gratuits en ligne pour la conversion, la compression et la transformation de fichiers. Le service est fourni \"tel quel\" sans garantie d'aucune sorte.",
|
||||||
"useTitle": "3. Utilisation acceptable",
|
"useTitle": "3. Utilisation acceptable",
|
||||||
"useItems": [
|
"useItems": [
|
||||||
"Vous ne pouvez télécharger que des fichiers que vous avez le droit de traiter.",
|
"Vous ne pouvez télécharger que des fichiers que vous avez le droit de traiter.",
|
||||||
@@ -248,9 +248,9 @@
|
|||||||
"Nous ne garantissons pas la préservation du contenu téléchargé au-delà de la fenêtre de traitement."
|
"Nous ne garantissons pas la préservation du contenu téléchargé au-delà de la fenêtre de traitement."
|
||||||
],
|
],
|
||||||
"liabilityTitle": "5. Limitation de responsabilité",
|
"liabilityTitle": "5. Limitation de responsabilité",
|
||||||
"liabilityText": "SaaS-PDF ne sera pas responsable des dommages directs, indirects, accessoires ou consécutifs résultant de l'utilisation ou de l'impossibilité d'utiliser le service. L'utilisation du service est à vos propres risques.",
|
"liabilityText": "Dociva ne sera pas responsable des dommages directs, indirects, accessoires ou consécutifs résultant de l'utilisation ou de l'impossibilité d'utiliser le service. L'utilisation du service est à vos propres risques.",
|
||||||
"ipTitle": "6. Propriété intellectuelle",
|
"ipTitle": "6. Propriété intellectuelle",
|
||||||
"ipText": "Tous les outils, interfaces et contenus de SaaS-PDF sont la propriété intellectuelle des opérateurs du service. Vous conservez la pleine propriété de tous les fichiers que vous téléchargez et traitez.",
|
"ipText": "Tous les outils, interfaces et contenus de Dociva sont la propriété intellectuelle des opérateurs du service. Vous conservez la pleine propriété de tous les fichiers que vous téléchargez et traitez.",
|
||||||
"changesTitle": "7. Modifications des conditions",
|
"changesTitle": "7. Modifications des conditions",
|
||||||
"changesText": "Nous nous réservons le droit de modifier ces conditions à tout moment. L'utilisation continue du service après les modifications constitue l'acceptation des conditions mises à jour.",
|
"changesText": "Nous nous réservons le droit de modifier ces conditions à tout moment. L'utilisation continue du service après les modifications constitue l'acceptation des conditions mises à jour.",
|
||||||
"contactTitle": "8. Contact",
|
"contactTitle": "8. Contact",
|
||||||
@@ -285,8 +285,8 @@
|
|||||||
"totalRatings": "évaluations"
|
"totalRatings": "évaluations"
|
||||||
},
|
},
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"metaTitle": "Tarifs — SaaS-PDF",
|
"metaTitle": "Tarifs — Dociva",
|
||||||
"metaDescription": "Comparez les plans gratuit et pro de SaaS-PDF. Accédez à plus de 30 outils gratuitement ou passez au pro pour un traitement illimité.",
|
"metaDescription": "Comparez les plans gratuit et pro de Dociva. Accédez à plus de 30 outils gratuitement ou passez au pro pour un traitement illimité.",
|
||||||
"title": "Plans & Tarifs",
|
"title": "Plans & Tarifs",
|
||||||
"subtitle": "Commencez gratuitement et passez au pro quand vous en avez besoin.",
|
"subtitle": "Commencez gratuitement et passez au pro quand vous en avez besoin.",
|
||||||
"free": "Gratuit",
|
"free": "Gratuit",
|
||||||
@@ -338,9 +338,9 @@
|
|||||||
"trustApiDesc": "Les espaces Pro peuvent générer des clés API et connecter les mêmes outils à des automatisations internes ou à des parcours clients."
|
"trustApiDesc": "Les espaces Pro peuvent générer des clés API et connecter les mêmes outils à des automatisations internes ou à des parcours clients."
|
||||||
},
|
},
|
||||||
"developers": {
|
"developers": {
|
||||||
"metaDescription": "Explorez le portail développeur SaaS-PDF, le flux API asynchrone et les endpoints prêts pour l'automatisation documentaire.",
|
"metaDescription": "Explorez le portail développeur Dociva, le flux API asynchrone et les endpoints prêts pour l'automatisation documentaire.",
|
||||||
"badge": "Portail développeur",
|
"badge": "Portail développeur",
|
||||||
"title": "Construisez des workflows documentaires sur l'API SaaS-PDF",
|
"title": "Construisez des workflows documentaires sur l'API Dociva",
|
||||||
"subtitle": "Utilisez dans vos propres systèmes les mêmes endpoints de conversion, compression, OCR et IA que ceux de l'application web.",
|
"subtitle": "Utilisez dans vos propres systèmes les mêmes endpoints de conversion, compression, OCR et IA que ceux de l'application web.",
|
||||||
"getApiKey": "Obtenir une clé API",
|
"getApiKey": "Obtenir une clé API",
|
||||||
"comparePlans": "Comparer les forfaits",
|
"comparePlans": "Comparer les forfaits",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import SEOHead from '@/components/seo/SEOHead';
|
|||||||
import { generateWebPage } from '@/utils/seo';
|
import { generateWebPage } from '@/utils/seo';
|
||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
|
|
||||||
const CONTACT_EMAIL = 'support@saas-pdf.com';
|
const CONTACT_EMAIL = 'support@dociva.io';
|
||||||
const API_BASE = import.meta.env.VITE_API_URL || '';
|
const API_BASE = import.meta.env.VITE_API_URL || '';
|
||||||
|
|
||||||
type Category = 'general' | 'bug' | 'feature';
|
type Category = 'general' | 'bug' | 'feature';
|
||||||
|
|||||||
@@ -239,7 +239,7 @@ export default function InternalAdminPage() {
|
|||||||
return (
|
return (
|
||||||
<div className="mx-auto max-w-7xl space-y-8">
|
<div className="mx-auto max-w-7xl space-y-8">
|
||||||
<Helmet>
|
<Helmet>
|
||||||
<title>Internal Admin | SaaS PDF</title>
|
<title>Internal Admin | Dociva</title>
|
||||||
<meta name="robots" content="noindex,nofollow" />
|
<meta name="robots" content="noindex,nofollow" />
|
||||||
</Helmet>
|
</Helmet>
|
||||||
|
|
||||||
|
|||||||
@@ -65,11 +65,11 @@ export default function PricingPage() {
|
|||||||
<>
|
<>
|
||||||
<SEOHead
|
<SEOHead
|
||||||
title={t('pages.pricing.title', 'Pricing')}
|
title={t('pages.pricing.title', 'Pricing')}
|
||||||
description={t('pages.pricing.metaDescription', 'Compare Free and Pro plans for SaaS-PDF. Get more file processing power, API access, and priority support.')}
|
description={t('pages.pricing.metaDescription', 'Compare Free and Pro plans for Dociva. Get more file processing power, API access, and priority support.')}
|
||||||
path="/pricing"
|
path="/pricing"
|
||||||
jsonLd={generateWebPage({
|
jsonLd={generateWebPage({
|
||||||
name: t('pages.pricing.title', 'Pricing'),
|
name: t('pages.pricing.title', 'Pricing'),
|
||||||
description: t('pages.pricing.metaDescription', 'Compare Free and Pro plans for SaaS-PDF.'),
|
description: t('pages.pricing.metaDescription', 'Compare Free and Pro plans for Dociva.'),
|
||||||
url: `${window.location.origin}/pricing`,
|
url: `${window.location.origin}/pricing`,
|
||||||
})}
|
})}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { generateWebPage } from '@/utils/seo';
|
|||||||
import { FILE_RETENTION_MINUTES } from '@/config/toolLimits';
|
import { FILE_RETENTION_MINUTES } from '@/config/toolLimits';
|
||||||
|
|
||||||
const LAST_UPDATED = '2026-03-06';
|
const LAST_UPDATED = '2026-03-06';
|
||||||
const CONTACT_EMAIL = 'support@saas-pdf.com';
|
const CONTACT_EMAIL = 'support@dociva.io';
|
||||||
|
|
||||||
export default function PrivacyPage() {
|
export default function PrivacyPage() {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { generateWebPage } from '@/utils/seo';
|
|||||||
import { FILE_RETENTION_MINUTES } from '@/config/toolLimits';
|
import { FILE_RETENTION_MINUTES } from '@/config/toolLimits';
|
||||||
|
|
||||||
const LAST_UPDATED = '2026-03-06';
|
const LAST_UPDATED = '2026-03-06';
|
||||||
const CONTACT_EMAIL = 'support@saas-pdf.com';
|
const CONTACT_EMAIL = 'support@dociva.io';
|
||||||
|
|
||||||
export default function TermsPage() {
|
export default function TermsPage() {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
export const RATING_PROMPT_EVENT = 'saaspdf:rating-prompt';
|
export const RATING_PROMPT_EVENT = 'dociva:rating-prompt';
|
||||||
|
|
||||||
interface RatingPromptOptions {
|
interface RatingPromptOptions {
|
||||||
forceOpen?: boolean;
|
forceOpen?: boolean;
|
||||||
|
|||||||
@@ -120,13 +120,13 @@ export function generateOrganization(origin: string): object {
|
|||||||
return {
|
return {
|
||||||
'@context': 'https://schema.org',
|
'@context': 'https://schema.org',
|
||||||
'@type': 'Organization',
|
'@type': 'Organization',
|
||||||
name: 'SaaS-PDF',
|
name: 'Dociva',
|
||||||
url: origin,
|
url: origin,
|
||||||
logo: `${origin}/favicon.svg`,
|
logo: `${origin}/favicon.svg`,
|
||||||
sameAs: [],
|
sameAs: [],
|
||||||
contactPoint: {
|
contactPoint: {
|
||||||
'@type': 'ContactPoint',
|
'@type': 'ContactPoint',
|
||||||
email: 'support@saas-pdf.com',
|
email: 'support@dociva.io',
|
||||||
contactType: 'customer support',
|
contactType: 'customer support',
|
||||||
availableLanguage: ['English', 'Arabic', 'French'],
|
availableLanguage: ['English', 'Arabic', 'French'],
|
||||||
},
|
},
|
||||||
@@ -149,7 +149,7 @@ export function generateWebPage(page: {
|
|||||||
url: page.url,
|
url: page.url,
|
||||||
isPartOf: {
|
isPartOf: {
|
||||||
'@type': 'WebSite',
|
'@type': 'WebSite',
|
||||||
name: 'SaaS-PDF',
|
name: 'Dociva',
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -172,11 +172,11 @@ export function generateBlogPosting(post: {
|
|||||||
inLanguage: post.inLanguage,
|
inLanguage: post.inLanguage,
|
||||||
author: {
|
author: {
|
||||||
'@type': 'Organization',
|
'@type': 'Organization',
|
||||||
name: 'SaaS-PDF',
|
name: 'Dociva',
|
||||||
},
|
},
|
||||||
publisher: {
|
publisher: {
|
||||||
'@type': 'Organization',
|
'@type': 'Organization',
|
||||||
name: 'SaaS-PDF',
|
name: 'Dociva',
|
||||||
},
|
},
|
||||||
mainEntityOfPage: post.url,
|
mainEntityOfPage: post.url,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -4,16 +4,29 @@ upstream backend {
|
|||||||
|
|
||||||
server {
|
server {
|
||||||
listen 80;
|
listen 80;
|
||||||
server_name _;
|
server_name dociva.io www.dociva.io;
|
||||||
client_max_body_size 100M;
|
client_max_body_size 100M;
|
||||||
|
|
||||||
# Redirect HTTP to HTTPS
|
# Redirect HTTP to HTTPS
|
||||||
return 301 https://$host$request_uri;
|
return 301 https://dociva.io$request_uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Redirect www to non-www
|
||||||
|
server {
|
||||||
|
listen 443 ssl http2;
|
||||||
|
server_name www.dociva.io;
|
||||||
|
client_max_body_size 100M;
|
||||||
|
|
||||||
|
ssl_certificate /etc/nginx/ssl/fullchain.pem;
|
||||||
|
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
|
||||||
|
ssl_protocols TLSv1.2 TLSv1.3;
|
||||||
|
|
||||||
|
return 301 https://dociva.io$request_uri;
|
||||||
}
|
}
|
||||||
|
|
||||||
server {
|
server {
|
||||||
listen 443 ssl http2;
|
listen 443 ssl http2;
|
||||||
server_name _;
|
server_name dociva.io;
|
||||||
client_max_body_size 100M;
|
client_max_body_size 100M;
|
||||||
|
|
||||||
# SSL certificates (mount via certbot / Let's Encrypt)
|
# SSL certificates (mount via certbot / Let's Encrypt)
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# deploy.sh — Production deployment script for SaaS-PDF
|
# deploy.sh — Production deployment script for Dociva
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
echo "========================================="
|
echo "========================================="
|
||||||
echo " SaaS-PDF Production Deployment"
|
echo " Dociva Production Deployment"
|
||||||
echo "========================================="
|
echo "========================================="
|
||||||
|
|
||||||
# Colors
|
# Colors
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ generate_sitemap.py
|
|||||||
Generates sitemap.xml for SEO from the full route inventory.
|
Generates sitemap.xml for SEO from the full route inventory.
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
python scripts/generate_sitemap.py --domain https://saas-pdf.com
|
python scripts/generate_sitemap.py --domain https://dociva.io
|
||||||
python scripts/generate_sitemap.py --domain https://saas-pdf.com --output frontend/public/sitemap.xml
|
python scripts/generate_sitemap.py --domain https://dociva.io --output frontend/public/sitemap.xml
|
||||||
# Or set SITE_DOMAIN env var and omit --domain
|
# Or set SITE_DOMAIN env var and omit --domain
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@@ -130,7 +130,7 @@ def generate_sitemap(domain: str) -> str:
|
|||||||
def main():
|
def main():
|
||||||
parser = argparse.ArgumentParser(description='Generate sitemap.xml')
|
parser = argparse.ArgumentParser(description='Generate sitemap.xml')
|
||||||
parser.add_argument('--domain', type=str, default=os.environ.get('SITE_DOMAIN', ''),
|
parser.add_argument('--domain', type=str, default=os.environ.get('SITE_DOMAIN', ''),
|
||||||
help='Site domain (e.g. https://saas-pdf.com). Falls back to SITE_DOMAIN env var.')
|
help='Site domain (e.g. https://dociva.io). Falls back to SITE_DOMAIN env var.')
|
||||||
parser.add_argument('--output', type=str, default='frontend/public/sitemap.xml', help='Output file path')
|
parser.add_argument('--output', type=str, default='frontend/public/sitemap.xml', help='Output file path')
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user