diff --git a/AGENTS.md b/AGENTS.md index 7d5c626..2afda7f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -24,7 +24,9 @@ Single-page static landing page for an NGO ERP product. index.html ← only HTML file — layout + all inline JS + i18n src/input.css ← Tailwind source (edit here, then rebuild) assets/site.css ← compiled output — DO NOT edit by hand -blog.json ← blog post data array +blog.json ← English blog posts (canonical + fallback) +blog.es.json ← Spanish blog posts +blog.de.json ← German blog posts tailwind.config.js ← design tokens (colors, fonts, shadows) ``` @@ -106,7 +108,21 @@ jq empty blog.json && echo "JSON valid" ## Blog Post Schema -`blog.json` is a root-level JSON array. Every post object contains **exactly these five fields**: +### Language-to-file mapping + +| Language | File loaded | Fallback | +|---|---|---| +| English (`en`) | `blog.json` | — | +| Spanish (`es`) | `blog.es.json` | `blog.json` | +| German (`de`) | `blog.de.json` | `blog.json` | + +The loader in `index.html` fetches the language-specific file automatically when the visitor switches language. If a language file is missing or returns an error, it falls back to `blog.json` silently. + +`blog.json` is always the **English source and fallback**. Keep all three files structurally identical — same number of posts, same order, translated content only. + +--- + +`blog.json` (and every language variant) is a root-level JSON array. Every post object contains **exactly these five fields**: ```json [ @@ -132,21 +148,31 @@ NEVER add extra fields (`slug`, `author`, `tags`, `excerpt`, `hero_image`, etc.) ### Adding a new blog post (jq method) +> Add to **all three files** in the same session. A post that exists in English but not in Spanish/German will silently fall back to the English version for those visitors — which is acceptable temporarily but should be resolved promptly. + ```bash # 1. Pull latest git pull origin main -# 2. Backup (once per session) -mkdir -p /backup && cp blog.json /backup/blog.json.$(date +%Y%m%d%H%M%S) +# 2. Backup all blog files once per session +mkdir -p /backup +for f in blog.json blog.es.json blog.de.json; do + cp $f /backup/$f.$(date +%Y%m%d%H%M%S) +done -# 3. Prepend new post — $NEW_JSON must be a valid single post object -jq --argjson new "$NEW_JSON" '. = [$new] + .' blog.json > tmp.json && mv tmp.json blog.json +# 3. Prepend new post to each language file +# $NEW_EN, $NEW_ES, $NEW_DE must each be a valid single post object +jq --argjson new "$NEW_EN" '. = [$new] + .' blog.json > tmp.json && mv tmp.json blog.json +jq --argjson new "$NEW_ES" '. = [$new] + .' blog.es.json > tmp.json && mv tmp.json blog.es.json +jq --argjson new "$NEW_DE" '. = [$new] + .' blog.de.json > tmp.json && mv tmp.json blog.de.json -# 4. Validate -jq empty blog.json && echo "JSON valid" +# 4. Validate all three +jq empty blog.json && echo "blog.json OK" +jq empty blog.es.json && echo "blog.es.json OK" +jq empty blog.de.json && echo "blog.de.json OK" # 5. Commit and push -git add blog.json +git add blog.json blog.es.json blog.de.json git commit -m "blog: add post –
Maria verbrachte ihre Abende mit Papierkram statt mit den Familien, denen sie helfen wollte. Mit Odoo und n8n reduzierte ihr Team den Verwaltungsaufwand in unter vier Wochen um ein Drittel.
", + "content": "Verstreute Spenderdaten, wiederholte Kopier-Einfüge-Schritte und langsame Bestätigungen untergraben das Vertrauen und kosten wertvolle Energie. Ein ERP bündelt Kontakte, Spenden, Rechnungen und Projektaufgaben an einem zentralen Ort — niemand muss dieselben Daten mehr in fünf verschiedene Tools eintippen.
Nutze Odoo für Kontakte, Spenden, Projekte und Dokumente. Erstelle dann n8n-Workflows, um automatische Spendenquittungen zu versenden, Kontaktdatensätze bei Formulareinreichungen zu aktualisieren, Folgeaufgaben zu terminieren und Zusammenfassungsberichte per Slack oder E-Mail zu verteilen.
Typische NGO-Implementierungen zeigen innerhalb weniger Wochen 20–40 % weniger Verwaltungsstunden. Marias Team hörte mit den nächtlichen Admin-Sprints auf und begann jeden Morgen mit einem einzigen Dashboard — mehr Zeit für Lehrercoaching, Gemeindebesuche und die Planung wirkungsvoller Programme.
" + }, + { + "area": "Spenderkommunikation", + "date": "2026-03-18", + "title": "Wie Maya das Spender-Chaos in klare Verbindungen verwandelte", + "teaser": "Maya verwandelte verstreute Spendernachrichten in einen reibungslosen, vertrauenswürdigen Ablauf, der die Unterstützung wachsen lässt und das gesamte Team auf Kurs hält.
", + "content": "Maya jonglierte früher mit Tabellen, E-Mail-Threads und Haftnotizen, um Spenderinteraktionen zu verfolgen. Nachrichten gingen verloren, Dankesworte kamen verspätet an und das Vertrauen bröckelte. Sie wusste, dass sich etwas ändern musste.
Sie kartierte jeden Kontaktpunkt: Erstkontakt, Spende, Nachfassaktionen, Erneuerungen und Sonderkampagnen. Jede Interaktion erhielt eine Karte in Odoo mit Spendername, Datum, bevorzugtem Kanal und Teamnotizen — für alle auf einen Blick sichtbar.
n8n übernimmt die Routine: Spender werden innerhalb von Minuten nach einer Zuwendung gedankt, Zusagen werden bestätigt und das Team wird vor fälligen Erneuerungen benachrichtigt. Nichts fällt durchs Raster, und der persönliche Ton bleibt erhalten — dank Vorlagen, die auf jedes Spendersegment zugeschnitten sind.
Spender können Updates zu den Projekten sehen, die sie unterstützt haben. Status-Labels in Kampagnen zeigen zugewiesene Mittel, Impact-Geschichten und bevorstehende Veranstaltungen. Mitarbeiter hinterlassen für Kollegen sichtbare Notizen — doppelte Kontaktaufnahmen und unangenehme Überschneidungen gehören der Vergangenheit an.
Ein Live-Dashboard zeigt Spenderaktivitäten, bevorstehende Erneuerungen und die Kampagnengesundheit auf einen Blick. Farbcodes setzen Prioritäten: Grün für bestätigte Gaben, Gelb für ausstehende Zusagen, Rot für dringende Nachfassaktionen, die menschliche Aufmerksamkeit erfordern.
Wöchentliche Spender-Check-ins halten das Team auf Kurs. Monatliche Newsletter heben Erfolge, Spender-Impact und kommende Möglichkeiten hervor. Sonderkampagnen lösen personalisierte Micro-E-Mails aus, die auf Spenderlevel und Verlauf jeder Person abgestimmt sind.
Die Spenderbindung verbesserte sich um 25 %. Reaktionszeiten sanken von Tagen auf Stunden. Mitarbeiter berichten von weniger Stress, weil Kommunikation berechenbar, sichtbar und nicht mehr vom Gedächtnis einer einzelnen Person abhängig ist.
Vier Schritte ersetzen wochenlange verstreute E-Mails und verpasste Möglichkeiten — und jeder Spender beginnt sich wirklich wahrgenommen zu fühlen.
" + } +] diff --git a/blog.es.json b/blog.es.json new file mode 100644 index 0000000..e78745e --- /dev/null +++ b/blog.es.json @@ -0,0 +1,16 @@ +[ + { + "area": "Automatización", + "date": "2026-03-25", + "title": "Reduce el trabajo administrativo de tu ONG un 20–40 %: 7 flujos que puedes automatizar este mes", + "teaser": "María pasaba sus noches sepultada en papeleo en lugar de ayudar a las familias que había venido a servir. Con Odoo y n8n, su equipo redujo el tiempo administrativo en un tercio en menos de cuatro semanas.
", + "content": "Datos dispersos de donantes, pasos repetitivos de copiar y pegar y acuses de recibo lentos erosionan la confianza y agotan la energía del equipo. Un ERP centraliza contactos, donaciones, facturas y tareas de proyecto en un único lugar, de modo que nadie tenga que reintroducir los mismos datos en cinco herramientas distintas.
Usa Odoo para Contactos, Donaciones, Proyectos y Documentos. Después crea flujos en n8n para enviar recibos automáticos a donantes, actualizar registros cuando se envían formularios, programar tareas de seguimiento y distribuir informes de resumen por Slack o correo electrónico.
Las implementaciones habituales en ONG muestran un 20–40 % menos de horas administrativas en pocas semanas. El equipo de María dejó de hacer maratones nocturnos de administración y empezó cada mañana con un solo panel de control, liberando tiempo para capacitar a docentes, visitar comunidades y planificar programas de impacto.
" + }, + { + "area": "Comunicación con Donantes", + "date": "2026-03-18", + "title": "Cómo Maya convirtió el caos de donantes en conexiones claras", + "teaser": "Maya transformó los mensajes dispersos de donantes en un flujo fluido y confiable que hace crecer el apoyo y mantiene a todo el equipo alineado.
", + "content": "Maya solía manejar hojas de cálculo, hilos de correo y notas adhesivas para rastrear las interacciones con donantes. Se perdían mensajes, los agradecimientos llegaban tarde y la confianza comenzaba a tambalearse. Sabía que algo tenía que cambiar.
Mapeó cada punto de contacto: contacto inicial, donación, seguimientos, renovaciones y campañas especiales. Cada interacción tuvo su tarjeta en Odoo con el nombre del donante, la fecha, el canal preferido y las notas del equipo, visible para todos de un vistazo.
n8n automatiza la rutina: agradece a los donantes a los pocos minutos de recibir una aportación, confirma los compromisos y avisa al equipo antes de que venzan las renovaciones. Nadie se queda sin respuesta y el tono personal se mantiene intacto gracias a plantillas diseñadas para cada segmento de donantes.
Los donantes pueden ver actualizaciones de los proyectos que apoyaron. Las etiquetas de estado en las campañas muestran los fondos asignados, historias de impacto y próximos eventos. El personal deja notas visibles para sus colegas, eliminando contactos duplicados y superposiciones incómodas.
Un panel en vivo muestra la actividad de donantes, las próximas renovaciones y la salud de la campaña de un solo vistazo. Los códigos de color marcan la prioridad: verde para donaciones confirmadas, amarillo para compromisos pendientes, rojo para seguimientos urgentes que requieren atención humana.
Las revisiones semanales de donantes mantienen al equipo alineado. Los boletines mensuales destacan logros, impacto de los donantes y próximas oportunidades. Las campañas especiales activan microemails personalizados según el nivel de donación y el historial de cada persona.
La retención de donantes mejoró un 25 %. Los tiempos de respuesta bajaron de días a horas. El personal reporta menos estrés porque la comunicación es predecible, visible y ya no depende de la memoria de una sola persona.
Cuatro pasos reemplazan semanas de correos dispersos y oportunidades perdidas — y cada donante empieza a sentirse genuinamente valorado.
" + } +] diff --git a/blog.json b/blog.json index 82fc89f..79fb9bb 100644 --- a/blog.json +++ b/blog.json @@ -1,9 +1,16 @@ [ + { + "area": "Automation", + "date": "2026-03-25", + "title": "Reduce NGO Admin by 20–40%: 7 Workflows You Can Automate This Month", + "teaser": "Maria spent her evenings buried in paperwork instead of serving the families she came to help. With Odoo and n8n, her team cut admin time by a third in under four weeks.
", + "content": "Scattered donor data, repeated copy-paste steps, and slow acknowledgements erode trust and drain energy. An ERP gives you one central place for contacts, donations, invoices, and project tasks — so people stop re-entering the same data into five different tools.
Use Odoo for Contacts, Donations, Projects, and Documents. Then build n8n workflows to trigger automatic donor receipts, update contact records when forms are submitted, schedule follow-up tasks, and push summary reports to Slack or email.
Common NGO implementations show 20–40% fewer administrative hours within weeks. Maria's team stopped doing nightly admin sprints and started each morning with a single dashboard — freeing her to coach teachers, visit communities, and plan programmes.
" + }, { "area": "Donor Communication", + "date": "2026-03-18", "title": "How Maya Turned Donor Chaos into Clear Connections", - "teaser": "Maya transformed scattered donor messages into a smooth, trustworthy flow that grows support.
", - "content": "Maya used to juggle spreadsheets, inbox threads, and sticky notes, trying to track donor interactions. Messages were missed, thank-yous delayed, and trust wavered.
\nShe mapped every donor touchpoint: initial contact, donation, follow-ups, renewals, and special campaigns.
\nEach interaction got a card in Odoo showing donor, date, preferred channel, and notes.
\nn8n automates reminders: thank donors, confirm gifts, and ping staff before renewals. No one misses a beat, and personalization stays intact.
\nDonors can see updates on projects they supported. Status labels on campaigns show funds allocated, impact stories, and upcoming events.
\nStaff leave notes visible to colleagues, so no duplicate outreach or awkward overlaps happen.
\nA live dashboard shows donor activity, upcoming renewals, and campaign health. Color codes indicate priority: green for confirmed gifts, yellow for pending pledges, red for urgent follow-ups.
\nWeekly donor check-ins keep the team aligned. Monthly newsletters highlight wins, donor impact, and upcoming opportunities. Special campaigns trigger micro-emails personalized by giving level.
\nDonor retention improved by 25%.
\nResponse times dropped from days to hours.
\nStaff report feeling less stressed because communication is predictable and visible.
\nThis replaces weeks of scattered emails and missed opportunities.
\nMicro-CTA: Want Maya’s donor management template? Reply “connect” and we’ll send the setup guide.
\nThe organization still hustles, but now each donor feels seen, valued, and in the loop. Maya smiles at every timely thank-you that lands without chasing anyone.
\nSubscribe to the NGO ops newsletter or book a donor communication clinic. We’ll map your donor flow, load it into Odoo, wire n8n alerts, and leave you with clear, trustworthy connections you can maintain effortlessly.
", - "date": "2026-03-25" + "teaser": "Maya transformed scattered donor messages into a smooth, trustworthy flow that grows support and keeps every team member aligned.
", + "content": "Maya used to juggle spreadsheets, inbox threads, and sticky notes trying to track donor interactions. Messages were missed, thank-yous arrived late, and trust wavered. She knew something had to change.
She mapped every donor touchpoint: initial contact, donation, follow-ups, renewals, and special campaigns. Each interaction got a card in Odoo showing the donor name, date, preferred channel, and notes — visible to the whole team at a glance.
n8n automates the routine: thank donors within minutes of a gift, confirm pledges, and ping staff before renewals fall due. No one misses a beat, and the personal tone stays intact because templates are built around each donor segment.
Donors can see updates on the projects they supported. Status labels on campaigns show funds allocated, impact stories, and upcoming events. Staff leave notes visible to colleagues so duplicate outreach and awkward overlaps never happen.
A live dashboard shows donor activity, upcoming renewals, and campaign health at a glance. Colour codes set the priority: green for confirmed gifts, yellow for pending pledges, red for urgent follow-ups that need a human touch.
Weekly donor check-ins keep the team aligned. Monthly newsletters highlight wins, donor impact, and upcoming opportunities. Special campaigns trigger personalised micro-emails based on giving level and history.
Donor retention improved by 25%. Response times dropped from days to hours. Staff report feeling less stressed because communication is predictable, visible, and no longer dependent on any one person's memory.
Four steps replace weeks of scattered emails and missed opportunities — and every donor starts to feel genuinely seen.
" } ] diff --git a/index.html b/index.html index 5112796..ed15850 100644 --- a/index.html +++ b/index.html @@ -388,19 +388,34 @@ let blogPosts = []; let blogExpanded = false; - if (blogGrid) { - fetch('blog.json') - .then(response => response.json()) - .then(data => { - blogPosts = Array.isArray(data) ? data : []; - renderBlogCards(); - }) - .catch(error => { - if (blogError) { - blogError.classList.remove('hidden'); - blogError.textContent = getTranslation(document.documentElement.lang, 'blog-error', 'Unable to load articles right now.'); - } - console.error('blog.json load failed', error); + function loadBlogPosts(lang) { + if (!blogGrid) return; + blogPosts = []; + blogExpanded = false; + if (blogError) blogError.classList.add('hidden'); + + function onData(data) { + blogPosts = Array.isArray(data) ? data : []; + renderBlogCards(); + } + + function showError() { + if (blogError) { + blogError.classList.remove('hidden'); + blogError.textContent = getTranslation(document.documentElement.lang, 'blog-error', 'Unable to load articles right now.'); + } + } + + var file = lang === 'en' ? 'blog.json' : 'blog.' + lang + '.json'; + fetch(file) + .then(function (r) { if (!r.ok) throw new Error(r.status); return r.json(); }) + .then(onData) + .catch(function () { + if (lang === 'en') { showError(); return; } + fetch('blog.json') + .then(function (r) { if (!r.ok) throw new Error(r.status); return r.json(); }) + .then(onData) + .catch(showError); }); } @@ -539,8 +554,7 @@ const value = translations[locale][key] ?? translations.en[key] ?? ''; if (value !== undefined) el.setAttribute('aria-label', value); }); - renderBlogCards(); - updateBlogToggleLabel(); + loadBlogPosts(locale); } document.getElementById('lang-selector').addEventListener('change', (event) => {