Technologies
- Astro Fully static, bilingual output with one view per page that receives the language, plus sitemap, hreflang, canonical, Open Graph and JSON-LD Organization data.
- TypeScript Typed site config, i18n dictionaries and the form limits shared by the browser and the server.
- Cloudflare Pages Functions A single POST /api/contact endpoint handles spam filtering, email delivery and lead storage.
- SMTP and Google Sheets API Enquiries go out through the company's own mail server by SMTP and can also be appended to a spreadsheet using a service account.
- GitHub Actions and Wrangler Every push to main builds the site and deploys it to Cloudflare Pages.
- Fontsource (Inter, Inter Tight, IBM Plex Mono) Self-hosted typefaces for headings, body copy and monospaced labels.
- Consent-aware analytics GA4, GTM, Meta Pixel and LinkedIn tags behind Google Consent Mode v2, loaded only when configured.
Project Overview
1945 SRL / 1945 Trade is a Buenos Aires company that offers end-to-end logistics solutions: freight, warehousing, customs, insurance, certifications, financial follow-up and special projects. The new site replaces the previous WordPress site at 1945srl.com.ar (it is not yet live on that domain) and is a bilingual, static rebuild with four pages per language: home, company, solutions and contact.
It is the second site I built for the same group as Lineal, so the goal was to reuse a proven base and give 1945 an identity of its own. I handled the content migration, design, frontend, form backend and deploy pipeline.
Objectives
- Migrate without losing content - Move the old WordPress copy to a faster static site, keeping the same Spanish URLs so no redirects are needed.
- Bilingual by design - Serve Spanish and English with their own routes and correct search metadata. The old site was Spanish only.
- Reliable lead capture - Make sure an enquiry is never lost silently and spam does not reach the team.
- Reuse with a distinct identity - Share the architecture with Lineal while keeping 1945’s own look.
- Privacy-aware measurement - Support analytics and ad tags without loading anything before consent.
Project Workflow
- Content migration - Reworked the copy of the four old pages (Inicio, Empresa, Soluciones, Contacto), fixing typos and writing the English version. No invented clients, figures or testimonials were added. The home figures (20+, 6, 5, 1) come from the old site’s text (twenty years of experience, six services, five industries, one provider) and are not presented as results.
- What was reused from Lineal - The Astro bilingual architecture (two typed dictionaries, one config file, views that receive the language), the contact Function, the consent and analytics layer, and the GitHub Actions to Cloudflare Pages deploy.
- What is different - A new identity based on black, paper and red with the logo’s pin as the motif: red dots on eyebrows, the pin as favicon and a loader where the pin drops. Four pages instead of eight, and the mail goes through the company’s own SMTP server instead of Google Workspace, since the domain does not use it.
- Imagery and hero - A daytime photo series generated with AI for each section, and a looping hero video with desktop and mobile cuts that fades from a matching still frame, which is also shown for reduced-motion users.
- Bilingual architecture - Spanish routes match the WordPress ones; English lives under
/en/. Includeshreflang, canonical URLs, JSON-LD, a sitemap and a 404. - Contact pipeline - A Cloudflare Pages Function validates the same-origin header, a honeypot field, fill time (between 3 seconds and 7 days) and link count. Spam gets a fake success response. Valid enquiries are emailed and can be appended to Google Sheets. The request succeeds if at least one destination worked.
- Consent and analytics - Google Consent Mode v2 with a cookie banner, and a tracking helper for lead events, with its own cookie and function prefix.
- Deploy pipeline - GitHub Actions with Wrangler to Cloudflare Pages on every push to main. The README lists the DNS records (mail, MX, SPF) that must be copied when moving the domain so email keeps working.
Results and Impact
- A single source of truth per language - All copy lives in two dictionaries and contact data in one config file.
- Form with no single point of failure - Email and spreadsheet are independent destinations.
- Antispam without third parties - Origin, honeypot, timing and link rules with no CAPTCHA, and limits shared by the browser and the server from one file.
- Consent respected by default - With no analytics IDs configured, no third-party script loads.
- Faster second build - Sharing the base with Lineal meant the work went into content, identity and the differences in mail setup.
- Zero-touch deploys - Pushing to main builds and publishes the site to Cloudflare Pages.