diff --git a/app/app/Http/Controllers/Web/SiteController.php b/app/app/Http/Controllers/Web/SiteController.php
index 6cae4cc..bf6736d 100644
--- a/app/app/Http/Controllers/Web/SiteController.php
+++ b/app/app/Http/Controllers/Web/SiteController.php
@@ -262,6 +262,11 @@ class SiteController extends Controller
return view('site.support');
}
+ public function download(): View
+ {
+ return view('site.download');
+ }
+
public function privacy(): View
{
return view('site.privacy');
diff --git a/app/resources/views/site/api-docs.blade.php b/app/resources/views/site/api-docs.blade.php
index 55e18cc..f07598a 100644
--- a/app/resources/views/site/api-docs.blade.php
+++ b/app/resources/views/site/api-docs.blade.php
@@ -52,6 +52,7 @@
Discover
API Docs
Pricing
+ Download
Support
diff --git a/app/resources/views/site/download.blade.php b/app/resources/views/site/download.blade.php
new file mode 100644
index 0000000..7f2df26
--- /dev/null
+++ b/app/resources/views/site/download.blade.php
@@ -0,0 +1,123 @@
+@extends('site.layout')
+
+@section('title', 'Download - Dewemoji')
+@section('meta_description', 'Download Dewemoji for Chrome and get notified when Android app is available.')
+
+@push('jsonld')
+
+@endpush
+
+@section('content')
+
+
+
+
+
+
+
+
+
+ Available now
+ Chrome Extension
+ Fast emoji search and copy workflow directly in your browser.
+
+
+ Install for Chrome
+
+ Existing extension URL stays the same on updates.
+
+
+
+ Coming soon
+ Android App
+ Native app release is in progress. We will launch internal testing first, then public release.
+
+
+ Android release in preparation
+
+
+ Recommended for now: use web dashboard + Chrome extension.
+
+
+
+
+ Platform Status
+
+
+
+
+ Chrome
+
+
Available
+
+
+
+
+ Android
+
+
In progress
+
+
+
+
+ Web
+
+
Available
+
+
+
+
+
+
+
+@endsection
diff --git a/app/resources/views/site/home.blade.php b/app/resources/views/site/home.blade.php
index 8556309..cdf02fb 100644
--- a/app/resources/views/site/home.blade.php
+++ b/app/resources/views/site/home.blade.php
@@ -42,6 +42,10 @@
Pricing
+
+
+ Download
+
Support
diff --git a/app/resources/views/site/layout.blade.php b/app/resources/views/site/layout.blade.php
index 1ee2dcf..e24e51a 100644
--- a/app/resources/views/site/layout.blade.php
+++ b/app/resources/views/site/layout.blade.php
@@ -406,6 +406,9 @@
Login
@endguest
+
+ Download
+
Support
diff --git a/app/resources/views/site/pricing.blade.php b/app/resources/views/site/pricing.blade.php
index 0eea75c..ae92a80 100644
--- a/app/resources/views/site/pricing.blade.php
+++ b/app/resources/views/site/pricing.blade.php
@@ -66,6 +66,9 @@
Pricing
+
+ Download
+
Support
diff --git a/app/resources/views/site/privacy.blade.php b/app/resources/views/site/privacy.blade.php
index cd5bb22..6819ba7 100644
--- a/app/resources/views/site/privacy.blade.php
+++ b/app/resources/views/site/privacy.blade.php
@@ -26,6 +26,7 @@
Discover
API Docs
Pricing
+ Download
Support
diff --git a/app/resources/views/site/support.blade.php b/app/resources/views/site/support.blade.php
index 43378ad..2b19825 100644
--- a/app/resources/views/site/support.blade.php
+++ b/app/resources/views/site/support.blade.php
@@ -31,6 +31,7 @@
Discover
API Docs
Pricing
+ Download
Support
diff --git a/app/resources/views/site/terms.blade.php b/app/resources/views/site/terms.blade.php
index 9f29b45..4d33a24 100644
--- a/app/resources/views/site/terms.blade.php
+++ b/app/resources/views/site/terms.blade.php
@@ -25,6 +25,7 @@
Discover
API Docs
Pricing
+ Download
Support
diff --git a/app/routes/web.php b/app/routes/web.php
index 944a372..30a1da0 100644
--- a/app/routes/web.php
+++ b/app/routes/web.php
@@ -16,6 +16,7 @@ Route::get('/emoji/{slug}', [SiteController::class, 'emojiDetail'])->name('emoji
Route::get('/pricing', [SiteController::class, 'pricing'])->name('pricing');
Route::post('/pricing/currency', [SiteController::class, 'setPricingCurrency'])->name('pricing.currency');
+Route::get('/download', [SiteController::class, 'download'])->name('download');
Route::get('/support', [SiteController::class, 'support'])->name('support');
Route::get('/privacy', [SiteController::class, 'privacy'])->name('privacy');
Route::get('/terms', [SiteController::class, 'terms'])->name('terms');
diff --git a/deployment-live-walkthrough.md b/deployment-live-walkthrough.md
new file mode 100644
index 0000000..6367af0
--- /dev/null
+++ b/deployment-live-walkthrough.md
@@ -0,0 +1,201 @@
+# Dewemoji Live Deployment Walkthrough
+
+This is the production rollout checklist for the `dewemoji` app.
+
+Use this in order:
+1. Prepare env
+2. Deploy code
+3. Run post-deploy commands
+4. Ensure admin access
+5. Verify billing/webhooks/search/auth
+
+---
+
+## 1) Pre-Deploy (Env + Infra)
+
+Set these in live environment first:
+
+```env
+APP_ENV=production
+APP_DEBUG=false
+APP_URL=https://your-live-domain.com
+```
+
+Core requirements:
+1. Database points to live DB (`DB_*`).
+2. `APP_KEY` is set and stable.
+3. `SESSION_DRIVER`, `CACHE_STORE`, `QUEUE_CONNECTION` configured.
+4. Billing provider secrets are set (PayPal/Pakasir).
+5. Allowed origins include live domain.
+
+Recommended billing cooldown config:
+
+```env
+DEWEMOJI_BILLING_PENDING_COOLDOWN_SECONDS=120
+```
+
+Webhook URLs:
+1. PayPal webhook: `https://your-live-domain.com/v1/paypal/webhook`
+2. Pakasir webhook: `https://your-live-domain.com/webhooks/pakasir`
+
+---
+
+## 2) Deploy Code
+
+From your server app directory (example `/var/www/html`):
+
+```bash
+git fetch --all
+git checkout main
+git pull origin main
+```
+
+Install dependencies if needed:
+
+```bash
+composer install --no-dev --optimize-autoloader
+```
+
+---
+
+## 3) Post-Deploy Commands (Required)
+
+Run in this exact sequence:
+
+```bash
+php artisan optimize:clear
+php artisan migrate --force
+php artisan config:cache
+```
+
+Optional but recommended:
+
+```bash
+php artisan route:cache
+php artisan view:cache
+```
+
+If you use queue workers:
+
+```bash
+php artisan queue:restart
+```
+
+Check migration status:
+
+```bash
+php artisan migrate:status
+```
+
+---
+
+## 4) Ensure Admin User
+
+Admin access is role-based (`users.role = admin`).
+
+### Option A: Promote existing user (recommended)
+
+```bash
+php artisan tinker --execute="\App\Models\User::where('email','dewemoji@gmail.com')->update(['role'=>'admin']);"
+```
+
+### Option B: Create admin user if missing
+
+```bash
+php artisan tinker --execute="
+\$u=\App\Models\User::firstOrCreate(
+ ['email'=>'dewemoji@gmail.com'],
+ ['name'=>'Dewemoji Admin','password'=>\Illuminate\Support\Facades\Hash::make('ChangeMeNow123!'),'tier'=>'free','email_verified_at'=>now()]
+);
+\$u->role='admin';
+\$u->save();
+"
+```
+
+Verify:
+
+```bash
+php artisan tinker --execute="dump(\App\Models\User::where('email','dewemoji@gmail.com')->first(['id','email','role','tier']));"
+```
+
+---
+
+## 5) Smoke Test Checklist (Live)
+
+### A. Core App
+1. Login/register works over HTTPS with no insecure form warnings.
+2. Dashboard loads.
+3. Discover search returns emojis.
+4. Emoji detail page loads.
+
+### B. Skin Tone
+1. Discover: change skin tone selector and verify toneable emoji changes.
+2. Detail: tone chips update hero emoji and copy behavior.
+3. Refresh page: tone preference persists.
+
+### C. Account + Keywords
+1. Free account can create up to active limit.
+2. Active/inactive keyword behavior reflected in search.
+3. Private keyword search appears in Discover after creation.
+
+### D. Billing
+1. PayPal checkout starts and returns.
+2. Pakasir QRIS starts and modal polls.
+3. Pending payment can be resumed.
+4. Cooldown prevents immediate repeated checkout spam.
+
+### E. Webhooks
+1. PayPal event recorded and payment status updates.
+2. Pakasir event recorded and payment status updates.
+
+Useful checks:
+
+```bash
+tail -n 200 storage/logs/laravel.log
+php artisan tinker --execute="dump(\App\Models\WebhookEvent::latest()->take(10)->get(['id','provider','event_type','status','created_at'])->toArray());"
+php artisan tinker --execute="dump(\App\Models\Payment::latest()->take(10)->get(['id','provider','plan_code','status','created_at'])->toArray());"
+```
+
+---
+
+## 6) Optional: PayPal Plan Sync (Admin)
+
+From admin dashboard:
+1. Open pricing admin page.
+2. Click sync PayPal plans.
+3. Confirm plan IDs are written and no 500.
+
+If there is failure, check:
+
+```bash
+tail -n 300 storage/logs/laravel.log | grep -Ei "paypal|sync|webhook|error|exception"
+```
+
+---
+
+## 7) Extension Release Order
+
+Release order:
+1. Site/backend live first.
+2. Verify API/auth on live domain.
+3. Update extension default API base to live.
+4. Publish extension update.
+
+This avoids extension users hitting endpoints that are not ready.
+
+---
+
+## 8) Rollback Strategy
+
+If release is broken:
+1. Re-deploy previous known-good git commit.
+2. Run:
+
+```bash
+php artisan optimize:clear
+php artisan config:cache
+php artisan queue:restart
+```
+
+3. If issue is emoji dataset, use snapshot activation in admin catalog.
+