Files
aigrowthtech/README.md
T
Alejandro Veras c561a18277 Point the sitemap, robots.txt and canonical links at the live domain
The www subdomain still serves the old site, so canonical and hreflang URLs now use
aigrowthtechnologies.com (overridable with SITE_URL). The sitemap also lists lastmod and changefreq.
2026-10-13 11:35:44 -04:00

3.2 KiB

AI Growth Technologies — website

Next.js 16 (App Router) site for aigrowthtechnologies.com.

Local development

npm ci
npm run dev          # http://localhost:3000

Environment variables

Copy .env.example to .env.production (or .env.local for development) and fill it in.

Variable Required Purpose
RESEND_API_KEY yes Resend key with sending access to aigrowthtechnologies.com. Without it the contact form shows an error.
CONTACT_FROM yes Sender, on the domain verified in Resend: AI Growth Website <hello@aigrowthtechnologies.com>
CONTACT_TO no Inbox that receives enquiries; separate several with commas. Defaults to rey@aigrowth360.io.
SITE_URL no Public address used for canonical links, hreflang, sitemap.xml and robots.txt. Defaults to https://aigrowthtechnologies.com.
CAPTCHA_SECRET no Signs the contact form's "I'm not a robot" challenges (a self-hosted proof of work, no third-party account). Without it a random secret is used per process, which only matters across restarts.

Deploying to a VPS

Requirements: Node.js 20.9 or newer (22 LTS recommended), npm, nginx, and a process manager such as pm2.

git clone https://github.com/AlejandroVeras/aigrowth-website.git
cd aigrowth-website
cp .env.example .env.production   # then edit it
npm ci
npm run build
pm2 start npm --name aigrowth-website -- start -- -p 3000
pm2 save && pm2 startup           # restart on reboot

To update later:

git pull && npm ci && npm run build && pm2 restart aigrowth-website

nginx

Put nginx in front of the Node server and turn off buffering so streamed pages arrive progressively:

server {
    server_name aigrowthtechnologies.com www.aigrowthtechnologies.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_buffering off;
    }
}

Then issue HTTPS with sudo certbot --nginx -d aigrowthtechnologies.com -d www.aigrowthtechnologies.com.

DNS

At Hostinger, point the A records for @ and www to the VPS IP. Leave the MX records (Titan email) and the Resend records (send, resend._domainkey) as they are.

Languages

The site is served in English (/), Spanish (/es) and Arabic (/ar, right to left). src/proxy.ts maps the unprefixed English URLs onto app/[lang]. Interface strings live in src/i18n/ui/, homepage copy in src/content/home/, and content pages in src/content/pages/<locale>/.

Content

Inner pages are generated from the Word copy decks:

python3 -E scripts/convert-docs.py "<folder with the .docx files>"

This rewrites src/content/pages/en/*.json. The homepage (src/app/[lang]/page.tsx) is written by hand.

Translations keep the English structure. python3 -E scripts/i18n.py extract <dir> writes the strings to translate, python3 -E scripts/i18n.py apply <es|ar> <dir> writes the translated pages, and python3 -E scripts/i18n.py index regenerates src/content/pages/index.ts.