Hostinger¶
Copy Premium Plugins Between Sites on Same Server¶
From legacy section: Hostinger / Server
Pattern: Needed Elementor Pro and WP Rocket on malkaribytali.com. Instead of downloading zips or asking Jim to upload, copied plugin directories from evolvebusiness.com on the same Hostinger server. Rule: When installing premium plugins (Elementor Pro, WP Rocket) on a new Hostinger site, check if they exist on another site first:
ls /home/u488157871/domains/[other-site]/public_html/wp-content/plugins/ | grep [plugin]. If found,cp -rthem over and activate with WP-CLI. Saves time and avoids license download hassles. Date: 2026-03-23
SSH Path Requires Full Path — No Tilde Expansion¶
From legacy section: Hostinger / Server
Pattern:
wp --path=~/domains/...failed because SSH MCP doesn't expand~. Rule: Always use full path/home/u488157871/domains/[site]/public_htmlin SSH commands. Never use~shorthand. Date: 2026-03-23
Wix Sites Don't Return Content via WebFetch¶
From legacy section: Hostinger / Server
Pattern: WebFetch on talikogan.com returned only Wix framework JS/CSS — no actual page content. Wix renders client-side. Rule: For Wix sites, use Chrome browser tools (navigate + get_page_text) to scrape content, not WebFetch. WebFetch only gets the initial HTML payload which on Wix is just framework code. Date: 2026-03-23
Wix JSON-LD is Server-Rendered — Use It for Bulk Scraping¶
From legacy section: Hostinger / Server
Pattern: Started with Chrome MCP to scrape Wix product pages one at a time. Discovered that Wix embeds JSON-LD structured data in the raw HTML source (server-side rendered). Python requests + BeautifulSoup can extract it without a browser. Rule: For Wix product scraping at scale, fetch raw HTML and parse
<script type="application/ld+json">. Contains name, description, images, price, availability. Note: Wix uses non-standard capitalization —Offers(notoffers) andAvailability(notavailability). Date: 2026-03-23
SSH MCP Timeout Doesn't Kill the Process¶
From legacy section: Hostinger / Server
Pattern: Ran WP-CLI import via SSH MCP. It timed out after 60s, but the server-side PHP process kept running. Started a second run via nohup — now two processes competed, creating duplicate-skip patterns. Rule: When an SSH MCP command times out, the server process may still be alive. Always
ps aux | grep [command]before re-running. Kill orphans first. For long-running WP-CLI tasks, always usenohupfrom the start. Date: 2026-03-23
Hostinger LiteSpeed CDN Caches Aggressively — Install Plugin to Purge¶
From legacy section: Hostinger / Server
Pattern: Switched themes from TwentyTwentyFive to Hello Elementor. WP-CLI confirmed the switch, but the public site still served the old theme.
x-litespeed-cache: hitwith 7-day max-age. Clearing WP Rocket cache, object cache, and rewrite rules did nothing. Rule: Hostinger uses LiteSpeed CDN (hcdnserver) with aggressive caching. To purge: (1)wp plugin activate litespeed-cache, (2)wp litespeed-purge all, (3)wp plugin deactivate litespeed-cache. Keep LiteSpeed Cache plugin installed but inactive for future purges. WP Rocket does NOT control the CDN layer. Date: 2026-03-24
Hostinger parked domain needs hPanel "Add Domain" — NS update alone leaves the zone empty¶
From legacy section: Hostinger / Server
Why: On 2026-05-18 Jim parked two keyword-rich domains (
freeseochecks.com,freeseohealthcheck.com) to evolvebusiness.com. The first worked end-to-end (NS at registrar pointed tobyte/pixel.dns-parking.com, Hostinger auto-populated@ALIAS →<domain>.cdn.hstgr.net.+ www CNAME + mail records). The second only had its NS updated at GoDaddy (cosmos/nova.dns-parking.com) — Hostinger's nameservers responded with a valid SOA (today's serial) but the zone was completely empty (HINFO RFC8482answer, no A record). DoH lookups returned "lame delegation" / REFUSED. Hostinger DNS API said "Domain not found" because the domain wasn't registered in the account's domain module. The CDN endpoint (<domain>.cdn.hstgr.net.) DID resolve to real IPs server-side — Hostinger just hadn't wired the zone to it. Fix: Jim added the domain via hPanel's parking/add-domain flow on the evolvebusiness.com plan; records auto-populated within minutes; mu-plugin host-match caught traffic immediately with zero code changes. How to apply: When parking an external domain to a Hostinger hosting plan, two steps are required, not one: (1) point the registrar's NS to Hostinger's parking nameservers (Hostinger assigns different pairs —byte/pixel,cosmos/nova, etc. — both are valid), AND (2) explicitly add the domain via hPanel → Websites → [target plan] → Parked Domains / Add Domain. Step 2 is what registers the zone with Hostinger's DNS-management module and triggers auto-population of the @ ALIAS + www CNAME pointing to the existing site's CDN endpoint. Diagnostic shortcut: ifmcp__hostinger-mcp__DNS_getDNSRecordsV1returns[](empty) for a domain whose NS is correctly pointed at Hostinger, the zone exists but step 2 was skipped. If it returns "Domain not found", same diagnosis. Don't try to manually write records via the API — it'll fail with "Domain not found" until hPanel registers the domain. Date: 2026-05-18
CommunityTech Plugin 404 ≠ Plugin Missing — May Mean Empty Kit¶
From legacy section: Hostinger / Server
Pattern: CommunityTech Elementor endpoints returned 404. Spent time troubleshooting plugin installation, but the actual issue was that the Elementor Kit had no settings configured yet. The 404 response body said
"empty_kit_settings". Rule: When CommunityTech returns 404, check the response body."empty_kit_settings"means the kit exists but has no data — use the update endpoints to populate it first. Only troubleshoot installation if the response says "endpoint not found." Date: 2026-03-24
Hostinger has multiple DNS pathways — only one is API-writable¶
From legacy section: SEO NEO / Workbook
Pattern: When attaching sandmans.net to Hostinger during the GoDaddy transfer, we cycled through three different Hostinger DNS pathways before finding one that worked: (1) "Connect External Domain" wizard — created a stub zone in Hostinger's
dns-parking.cominfrastructure, returned empty[]for GET but{"message":"Domain not found"}for write via API, blocked behind a NS-verification gate. (2) "Account-level Parked Domain" outside the website context — same problem. (3) Website-level "Parked Domain" attachment under sandmansblasting.com (hPanel → Hosting → sandmansblasting.com → Domains → Parked Domains) — this is the correct path for making Hostinger serve a parent's WordPress for an additional domain. Compounding the issue: Hostinger's Server IN-671 maintenance window (20:30-22:30 UTC) had verification queues stalled. We pivoted to Cloudflare DNS to bypass the entire Hostinger DNS stack. Rule: Hostinger has multiple "add a domain" pathways with different infrastructure backing them. For DNS-only management of an external domain (registered elsewhere): use the standalone DNS Zone Editor (Domains → DNS / Nameservers) — but be aware verification stalls are common and the API endpoint may be intermittently unavailable. For making Hostinger serve a website at an additional domain: use website-level Parked Domains (Hosting → [website] → Domains → Parked Domains) — this is the equivalent of cPanel "addon domain" and is what makes Apache/nginx route requests for that hostname to the parent site's document root. Don't use account-level parking for either case. Always checkhttps://statuspage.hostinger.com/for active maintenance windows before debugging API failures — server-cluster maintenance routinely blocks DNS provisioning. If Hostinger's stack is acting up and email is at risk, pivot to Cloudflare DNS (free, ~5 min to set up) rather than waiting on Hostinger's verification queue. Date: 2026-04-27
Hostinger primary-domain swap can leave edge CDN stuck — bypass via direct A-record to LiteSpeed origin¶
From legacy section: SEO NEO / Workbook
Pattern: During the sandmans.net primary domain swap on 2026-04-28, after Jim completed the Hostinger panel workflow (unpark sandmans.net → switch primary from sandmansblasting.com → re-park sandmansblasting.com), the Hostinger API immediately confirmed the website attachment as
vhost_type: addon,is_enabled: true, with WP files moved to the new docroot and siteurl/home auto-updated by Hostinger's swap. Direct curl to LiteSpeed origin (156.67.77.152) returned WordPress withx-powered-by: PHP/8.3.30perfectly. But every Hostinger CDN edge node tested (88.223.87.65, 88.223.87.78, 147.79.79.253) returned the static "Parked Domain name on Hostinger DNS system" template viaserver: hcdnfor 30+ minutes. Cleared Hostinger's hPanel cache — no effect. Removed theDO_NOT_UPLOAD_HEREmarker file from/home/u<user>/domains/<domain>/— no effect. The edge config never reconciled with the addon attachment, despite the API and origin both showing healthy. We waited 30+ min before pivoting to a workaround. Rule: When swapping primary domains on Hostinger and the new primary stays stuck behind the parked-domain template at the edge for >15 min after the API confirmsvhost_type: addon+is_enabled: true, don't wait for Hostinger support — change the DNS A record at your DNS host (Cloudflare, etc.) to point directly to the LiteSpeed origin IP. Find the origin IP by curl-resolving against known Hostinger origin IPs (156.67.77.152 currently works for the u488157871 plan; verify bycurl -sI --resolve domain:443:156.67.77.152 https://domain/and looking forserver: LiteSpeed+x-powered-by: PHP). The site comes up immediately. Tradeoff: lose Hostinger's edge CDN benefits (caching, edge SSL termination, DDoS shielding) but gain instant reliability — heavily favorable for SEO/canonical sites where reliability beats micro-latency. If Hostinger's edge propagation eventually recovers (check periodically), the A record can be reverted to an edge IP for CDN benefits — low priority cleanup. Date: 2026-04-28
Hostinger upload bandwidth: chunk large uploads, parallel SCPs share total bandwidth (~5 MB/s aggregate)¶
From legacy section: SEO NEO / Workbook
Pattern: Empire Media Network deployment required uploading 1.7 GB of compressed PDFs in one tarball. Single-stream SCP at 4 MB/s = ~7 minutes baseline, but Bash tool's default 2-min timeout killed it at 1.4 GB (truncated tarball, no error returned). Switching to 5 parallel chunked tarballs (sl/crl/sb/spac/covers) gave failure isolation but didn't speed up total throughput — Hostinger SSH appears bandwidth-throttled at ~5 MB/s aggregate per account, divided across all concurrent connections. Single stream gets ~3-5 MB/s; 5 parallel streams each get ~1 MB/s. Rule: For multi-GB Hostinger uploads: (1) ALWAYS use
run_in_background: truewithtimeout: 1800000+on the Bash tool — never let a long SCP run in foreground default-timeout. (2) Chunk by logical group (per-prefix here: sl/crl/sb/spac) BUT understand it doesn't increase total speed — only increases failure isolation (one chunk failing doesn't lose all 4.6 GB of progress). (3) Smaller chunks (50-200 MB) finish faster individually, freeing pipeline downstream — extract them as soon as they land. (4) For very large single chunks (1 GB+), run a backgroundMonitorpollingstat -c%s remote-fileevery 60-120 sec — gives visible progress + auto-detects completion when size matches local. (5) Plan for ~10 min/GB upload time when scoping deploys; a 4.6 GB total upload took ~75 min wall-clock parallel. Date: 2026-04-28
Hostinger Site Mailer verification = SendGrid CNAMEs (no separate Site Mailer DKIM exists)¶
Moved to sops/sendgrid-domain-auth.md on 2026-05-20 — see SOP for the full domain auth playbook. Key gotcha: don't hunt for "Site Mailer-specific" records — they're standard SendGrid CNAMEs (em#### + 2× dkim).