72 Commits

Author SHA1 Message Date
oliver d4c8760007 fix: add copy-link button and hash deep-linking for blog articles 2026-05-15 06:49:52 -03:00
Oliver b8fc96ea0a Add blog post: Make Smarter Decisions With Better Data 2026-05-14 12:34:04 -03:00
oliver 966441e6aa fix: wire Book Meeting (nav + hero) and Request scoped help to calendar modal 2026-05-05 18:04:37 -03:00
oliver 43d66fd295 content: add Schedule a Meeting button with calendar modal next to trial widget 2026-05-05 17:28:30 -03:00
oliver 5afda4e953 fix: article CTA panel scrolls with content, appears below last paragraph 2026-05-05 15:00:18 -03:00
oliver c6d3e2516e fix: remove Book a free demo button from 4 blog posts
content: add free trial CTA panel (email + location + submit) to article modal lower-right
2026-05-05 14:57:13 -03:00
Oliver 3ac4e9bb4a Add blog post: From Spreadsheet Chaos to Donor-Ready Insights 2026-05-05 14:30:50 -03:00
Oliver eb2f6802fd Fix: button always pinned to bottom of card regardless of content height 2026-05-05 14:27:55 -03:00
Oliver 8bb70a9af0 Add blog post: Never Lose a Donor Again: Track Every Relationship with Ease 2026-05-05 14:17:51 -03:00
Oliver 8755db3305 Add blog post: No One Owned It: How Small NGOs Close the Accountability Gap on Donor Follow-Ups 2026-05-05 14:08:58 -03:00
Oliver 2fa1a5eb3a Fix: pin 'How to implement this' button to card bottom 2026-05-05 14:06:39 -03:00
Oliver 75fc2ccc3b Add blog post: Never Forget a Donor Again 2026-05-05 14:02:24 -03:00
Oliver e44d99c7e7 Add blog post: Gather Feedback That Helps You Grow 2026-05-05 13:54:46 -03:00
Oliver dedec93e23 Add blog post: Keep Donors Informed Automatically 2026-05-05 13:45:36 -03:00
Oliver 9a120ab0d6 Add blog post: Building Donor Trust With Organized NGO Operations 2026-05-05 13:38:50 -03:00
Oliver 6079039f21 Automated landing-page update & add blog post 2026-05-04 19:25:25 -03:00
Oliver 2cf4dcbdae Automated landing-page update & add blog post: Stop Reconciling Spreadsheets. Start Showing Real Impact. 2026-05-04 18:42:57 -03:00
Oliver e9dc4a6a0d Automated landing-page update & add blog post 2026-05-04 18:41:27 -03:00
Oliver f488a103c8 Automated landing-page update & add blog post 2026-05-04 18:34:45 -03:00
Oliver df5eeeb00c blog: re-style iframe.article — position right next to first paragraph, double size 2026-05-03 20:29:37 +00:00
oliver b581601064 style 2026-05-03 16:48:25 -03:00
oliver 77bc63de24 post 2026-05-03 16:46:15 -03:00
Oliver a86684f6d1 p 2026-05-03 19:37:12 +00:00
oliver b82c04ce51 posts 2026-05-03 15:35:20 -03:00
Oliver df20b2fb51 Add blog post: How Donor Management Helps NGOs Build Lasting Relationships 2026-05-03 14:03:39 +00:00
oliver 77aaa9989e fix: strip existing extension from post.image before appending .webp 2026-05-03 07:43:25 -03:00
oliver c5a862f7ba Update posts.json 2026-05-03 07:35:50 -03:00
Oliver 3bf0060439 Add blog post: How Small NGOs Can Reclaim Their Time from Administrative Work 2026-05-03 10:26:57 +00:00
oliver a5b3b9d36f content: SEO optimisation for 'how to manage a non profit organization' 2026-05-03 06:41:30 -03:00
oliver 440cc084d3 fix: article-body scroll vertical only, remove column layout 2026-05-03 06:25:37 -03:00
oliver f9a263dd8c fix: modal scroll vertical only, hide horizontal overflow 2026-05-03 06:19:37 -03:00
oliver fdc1a1a215 content: article modal now scrolls horizontally with newspaper columns 2026-05-03 06:15:55 -03:00
oliver 10ac10a92a fix: remove overflow clip from article modal to ensure vertical scroll works 2026-05-03 06:15:03 -03:00
oliver a9ea122ac5 content: rename Solutions to Tutorials, link to blog section 2026-05-03 06:13:59 -03:00
oliver f865d549d1 content: remove NGO offer card, fix article modal vertical scroll 2026-05-03 06:01:58 -03:00
oliver 3215694f5c content: rework hero for NGO ICP with 50% offer, rework blog heading 2026-05-03 05:55:01 -03:00
oliver 8594393664 fix: hero image visibility and article modal vertical scrolling 2026-05-03 05:50:54 -03:00
oliver b0dde481cf content: blog card redesign with 4-line teaser, article modal, hero bg update 2026-05-03 05:45:06 -03:00
oliver 5172bfe62c Update posts.json 2026-05-03 05:11:49 -03:00
oliver d518ad2ae4 fix: align blog renderer field names with posts.json schema 2026-05-03 05:10:29 -03:00
Oliver 62c4aee24c Add blog post: How to Build Donor Trust with Transparent Impact Reporting 2026-05-02 23:23:30 +00:00
Oliver d92c72a6cd Automated landing-page text update and empty posts.json 2026-05-02 23:01:32 +00:00
Oliver 3005e53d6e Delete 'Pick the vertical' block and move 'Live from the field' up 2026-05-02 22:49:43 +00:00
oliver afb5a2ac20 migrate 2026-04-26 10:32:18 -03:00
Your Name 3afcf77a16 name 2026-04-15 10:00:44 -03:00
Dev e542bbd44a blog: add post – NGO ERP: Donor Management & Fundraising Software Guide 2026-04-08 19:47:42 +00:00
Dev a626defcfd content: update trial, meeting sections and remove broken CTAs 2026-04-08 19:37:41 +00:00
Dev b2cb2a1a8e content: update homepage value cards with new localized copy and CTAs 2026-04-08 19:32:34 +00:00
Dev 3549e8757e Update homepage SEO copy + OG tags + hero/value props (SEO keywords) 2026-04-08 19:17:05 +00:00
Your Name 2b2baf6851 fix 2026-04-07 17:11:56 -03:00
Your Name e649373118 f 2026-04-07 17:10:51 -03:00
Your Name f3cb8ca848 fix: show total hours right-aligned in Today's Todos headline 2026-04-07 05:50:00 -03:00
Your Name acec840d91 Add minutes 2026-04-07 05:48:45 -03:00
Your Name 0d5205ac94 fix: display meeting times from ISO offset string, not browser timezone 2026-03-31 09:58:12 -03:00
Your Name 1a4a9542f5 fix: Latest Signups full height, count badge, remove Current Test box, handle array/object JSON 2026-03-30 10:59:23 -03:00
Your Name bd319d05a5 del 2026-03-30 09:14:06 -03:00
Your Name 2a0af148c8 block 2026-03-30 08:21:13 -03:00
Your Name ad7a531ea0 typo 2026-03-30 08:02:42 -03:00
Your Name fd91306cb0 added Dash 2026-03-30 08:01:42 -03:00
Oliver 4ea7586a7f google verification 2026-03-27 18:40:05 -03:00
Oliver 671ddb2b75 content: update impact strip stats — 55% no-ERP, 32% admin reduction 2026-03-27 18:32:05 -03:00
Oliver 7d447bee93 fix: footer links align-bottom; send btn inside textarea bottom-right, border color 2026-03-27 18:23:24 -03:00
Oliver 5cc4486ab7 fix: 2× textarea height; footer copyright br + remove dash 2026-03-27 18:18:09 -03:00
Oliver 6e4b1c891c feat: append IP + geo (city, region, country, org) to feedback webhook via ipapi.co 2026-03-27 18:15:26 -03:00
Oliver f1f67b29dd fix: footer textarea 50% smaller; translate placeholder EN/ES/DE 2026-03-27 18:13:46 -03:00
Oliver d568a365df fix: footer textarea size+scrollbar+arrow; bundle i18n; meeting copy update 2026-03-27 18:09:42 -03:00
Oliver 4781e84ebc perf: remove Google Fonts — system font stack for body and headings; rebuild site.css -48% 2026-03-27 18:04:06 -03:00
Oliver be09564a25 feat: badge text, 6-item bundle card, footer textarea 2×wide 30%tall, SVG send icon 2026-03-27 17:59:40 -03:00
Oliver 0fc5b59d5f feat: footer feedback widget — textarea + send to webhook 2026-03-27 17:46:37 -03:00
Oliver 5526873a41 design: promote NGO warm design to index.html; AU Sydney; bundle card; india.webp hero 2026-03-27 17:40:57 -03:00
Oliver d111b55de0 feat: blog modal with animation, replace trial form with product/location/webhook widget 2026-03-27 16:56:52 -03:00
Oliver 5bd3c7b398 feat: multi-language blog posts — add blog.es.json, blog.de.json; load by locale with EN fallback 2026-03-27 16:40:03 -03:00
21 changed files with 6993 additions and 1713 deletions
+35 -9
View File
@@ -24,7 +24,9 @@ Single-page static landing page for an NGO ERP product.
index.html ← only HTML file — layout + all inline JS + i18n index.html ← only HTML file — layout + all inline JS + i18n
src/input.css ← Tailwind source (edit here, then rebuild) src/input.css ← Tailwind source (edit here, then rebuild)
assets/site.css ← compiled output — DO NOT edit by hand 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) tailwind.config.js ← design tokens (colors, fonts, shadows)
``` ```
@@ -106,7 +108,21 @@ jq empty blog.json && echo "JSON valid"
## Blog Post Schema ## 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 ```json
[ [
@@ -132,21 +148,31 @@ NEVER add extra fields (`slug`, `author`, `tags`, `excerpt`, `hero_image`, etc.)
### Adding a new blog post (jq method) ### 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 ```bash
# 1. Pull latest # 1. Pull latest
git pull origin main git pull origin main
# 2. Backup (once per session) # 2. Backup all blog files once per session
mkdir -p /backup && cp blog.json /backup/blog.json.$(date +%Y%m%d%H%M%S) 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 # 3. Prepend new post to each language file
jq --argjson new "$NEW_JSON" '. = [$new] + .' blog.json > tmp.json && mv tmp.json blog.json # $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 # 4. Validate all three
jq empty blog.json && echo "JSON valid" 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 # 5. Commit and push
git add blog.json git add blog.json blog.es.json blog.de.json
git commit -m "blog: add post <title>" git commit -m "blog: add post <title>"
git push origin main git push origin main
``` ```
-50
View File
@@ -1,50 +0,0 @@
# NGO Website — ODOO4projects
**Project:** NGO marketing homepage and blog
**URL:** [ngo.odoo4projects.com](https://ngo.odoo4projects.com)
**Stack:** Static HTML · Tailwind CSS · Vanilla JS
---
## BLOG POSTS
Blog posts live in `blog.json` — do not create separate backup files.
To add a blog post customize this command
jq '.arrays[0] = [$NEW_JSON] + .arrays[0]' blog.json > tmp.json && mv tmp.json blog.json
## Repository Rules
- Do not touch this readme
- Keep the seperation of Site and the blogposts in blog.json
Example of JSON structure for blog.json
{
"area": "Transparency",
"title": "Every Peso on the Page: Ana's Ledger Story",
"teaser": "<p>Ana replaced five notebooks with a four-stop impact ledger and now answers donor questions in seconds.</p>",
"content": "<h3>Every peso needs a map</h3>\n<p>Ana used to juggle five notebooks and still felt blind when a donor asked where their coin landed.</p>\n<h3>Pressure points</h3>\n<p without late nights.</p>\n",
"date": "2026-03-22"
},
---
## Page Structure
| # | Block | Purpose |
|---|-------|---------|
| 1 | **Hero** | Headline, subheadline, free-trial CTA, key stats |
| 2 | **Hot NGO Topics** | Three focused topic cards (transparency, communications, fundraising) |
| 3 | **Blog** | Latest articles loaded dynamically from `blog.json` |
| 4 | **Sign Up — Free Trial** | Email signup form, 4-week free trial, no credit card |
| 5 | **Have a Meeting** | 30-minute consultation booking via Google Calendar |
---
## Languages
| Code | Language |
|------|----------|
| `en` | English (default) |
| `es` | Español |
| `de` | Deutsch |
All UI strings are managed via the inline `translations` object in `index.html`.
-1
View File
File diff suppressed because one or more lines are too long
-9
View File
@@ -1,9 +0,0 @@
[
{
"area": "Donor Communication",
"title": "How Maya Turned Donor Chaos into Clear Connections",
"teaser": "<p>Maya transformed scattered donor messages into a smooth, trustworthy flow that grows support.</p>",
"content": "<h3>From scattered emails to a single view</h3>\n<p>Maya used to juggle spreadsheets, inbox threads, and sticky notes, trying to track donor interactions. Messages were missed, thank-yous delayed, and trust wavered.</p>\n<h3>Organizing the donor journey</h3>\n<p>She mapped every donor touchpoint: initial contact, donation, follow-ups, renewals, and special campaigns.</p>\n<p>Each interaction got a card in Odoo showing donor, date, preferred channel, and notes.</p>\n<h3>Automated touchpoints</h3>\n<p>n8n automates reminders: thank donors, confirm gifts, and ping staff before renewals. No one misses a beat, and personalization stays intact.</p>\n<h3>Transparency everywhere</h3>\n<p>Donors can see updates on projects they supported. Status labels on campaigns show funds allocated, impact stories, and upcoming events.</p>\n<p>Staff leave notes visible to colleagues, so no duplicate outreach or awkward overlaps happen.</p>\n<h3>Visual dashboards</h3>\n<p>A 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.</p>\n<h3>Communication rhythm</h3>\n<p>Weekly 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.</p>\n<ul>\n <li>Monday: review new donors and pending follow-ups.</li>\n <li>Wednesday: confirm campaign progress and donor notes.</li>\n <li>Friday: send thank-you emails and impact updates.</li>\n</ul>\n<h3>Metrics & impact</h3>\n<p>Donor retention improved by 25%.</p>\n<p>Response times dropped from days to hours.</p>\n<p>Staff report feeling less stressed because communication is predictable and visible.</p>\n<h3>Rollout plan</h3>\n<ul>\n <li>Import all donor records into Odoo cards and tag owners.</li>\n <li>Set n8n alerts for gifts, follow-ups, and renewals.</li>\n <li>Create dashboards showing active donors, pledges, and campaign status.</li>\n <li>Automate thank-you emails and impact updates.</li>\n</ul>\n<p>This replaces weeks of scattered emails and missed opportunities.</p>\n<p><strong>Micro-CTA:</strong> Want Mayas donor management template? Reply “connect” and well send the setup guide.</p>\n<h3>Story beats returned</h3>\n<p>The 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.</p>\n<h3>Your invitation</h3>\n<p>Subscribe to the NGO ops newsletter or book a donor communication clinic. Well map your donor flow, load it into Odoo, wire n8n alerts, and leave you with clear, trustworthy connections you can maintain effortlessly.</p>",
"date": "2026-03-25"
}
]
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

+1
View File
@@ -0,0 +1 @@
google-site-verification: google261cafffa78d8c3d.html
+114
View File
@@ -0,0 +1,114 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg fill="#000000" width="800px" height="800px" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g transform="matrix(1,0,0,1,-1152,-256)">
<rect id="Icons" x="0" y="0" width="1280" height="800" style="fill:none;"/>
<g id="Icons1" serif:id="Icons">
<g id="Strike">
</g>
<g id="H1">
</g>
<g id="H2">
</g>
<g id="H3">
</g>
<g id="list-ul">
</g>
<g id="hamburger-1">
</g>
<g id="hamburger-2">
</g>
<g id="list-ol">
</g>
<g id="list-task">
</g>
<g id="trash">
</g>
<g id="vertical-menu">
</g>
<g id="horizontal-menu">
</g>
<g id="sidebar-2">
</g>
<g id="Pen">
</g>
<g id="Pen1" serif:id="Pen">
</g>
<g id="clock">
</g>
<g id="external-link">
</g>
<g id="hr">
</g>
<g id="info">
</g>
<g id="warning">
</g>
<g id="plus-circle">
</g>
<g id="minus-circle">
</g>
<g id="vue">
</g>
<g id="cog">
</g>
<g id="logo">
</g>
<g id="radio-check">
</g>
<g id="eye-slash">
</g>
<g id="eye">
</g>
<g id="toggle-off">
</g>
<g id="shredder">
</g>
<g id="spinner--loading--dots-" serif:id="spinner [loading, dots]">
</g>
<g id="react">
</g>
<g id="check-selected">
</g>
<g id="turn-off">
</g>
<g id="code-block">
</g>
<g id="user">
</g>
<g id="coffee-bean">
</g>
<g transform="matrix(0.638317,0.368532,-0.368532,0.638317,785.021,-208.975)">
<g id="coffee-beans">
<g id="coffee-bean1" serif:id="coffee-bean">
</g>
</g>
</g>
<g id="coffee-bean-filled" transform="matrix(0.866025,0.5,-0.5,0.866025,717.879,-387.292)">
<g transform="matrix(1,0,0,1,0,-0.699553)">
<path d="M737.673,328.231C738.494,328.056 739.334,328.427 739.757,329.152C739.955,329.463 740.106,329.722 740.106,329.722C740.106,329.722 745.206,338.581 739.429,352.782C737.079,358.559 736.492,366.083 738.435,371.679C738.697,372.426 738.482,373.258 737.89,373.784C737.298,374.31 736.447,374.426 735.735,374.077C730.192,371.375 722.028,365.058 722.021,352C722.015,340.226 728.812,330.279 737.673,328.231Z"/>
</g>
<g transform="matrix(-1,0,0,-1,1483.03,703.293)">
<path d="M737.609,328.246C738.465,328.06 739.344,328.446 739.785,329.203C739.97,329.49 740.106,329.722 740.106,329.722C740.106,329.722 745.206,338.581 739.429,352.782C737.1,358.507 736.503,365.948 738.383,371.527C738.646,372.304 738.415,373.164 737.796,373.703C737.177,374.243 736.294,374.356 735.56,373.989C730.02,371.241 722.028,364.92 722.021,352C722.016,340.255 728.779,330.328 737.609,328.246Z"/>
</g>
</g>
<g transform="matrix(0.638317,0.368532,-0.368532,0.638317,913.062,-208.975)">
<g id="coffee-beans-filled">
<g id="coffee-bean2" serif:id="coffee-bean">
</g>
</g>
</g>
<g id="clipboard">
</g>
<g transform="matrix(1,0,0,1,128.011,1.35415)">
<g id="clipboard-paste">
</g>
</g>
<g id="clipboard-copy">
</g>
<g id="Layer1">
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.5 KiB

+224
View File
@@ -0,0 +1,224 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg
fill="#000000"
width="800px"
height="800px"
viewBox="0 0 64 64"
version="1.1"
xml:space="preserve"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"
id="svg6"
sodipodi:docname="bean_dark_Roast.svg"
inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:serif="http://www.serif.com/"><defs
id="defs6" /><sodipodi:namedview
id="namedview6"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="1.075"
inkscape:cx="400"
inkscape:cy="400"
inkscape:window-width="1920"
inkscape:window-height="1129"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg6" />
<g
transform="matrix(1,0,0,1,-1152,-256)"
id="g6">
<rect
id="Icons"
x="0"
y="0"
width="1280"
height="800"
style="fill:none;" />
<g
id="Icons1"
serif:id="Icons">
<g
id="Strike">
</g>
<g
id="H1">
</g>
<g
id="H2">
</g>
<g
id="H3">
</g>
<g
id="list-ul">
</g>
<g
id="hamburger-1">
</g>
<g
id="hamburger-2">
</g>
<g
id="list-ol">
</g>
<g
id="list-task">
</g>
<g
id="trash">
</g>
<g
id="vertical-menu">
</g>
<g
id="horizontal-menu">
</g>
<g
id="sidebar-2">
</g>
<g
id="Pen">
</g>
<g
id="Pen1"
serif:id="Pen">
</g>
<g
id="clock">
</g>
<g
id="external-link">
</g>
<g
id="hr">
</g>
<g
id="info">
</g>
<g
id="warning">
</g>
<g
id="plus-circle">
</g>
<g
id="minus-circle">
</g>
<g
id="vue">
</g>
<g
id="cog">
</g>
<g
id="logo">
</g>
<g
id="radio-check">
</g>
<g
id="eye-slash">
</g>
<g
id="eye">
</g>
<g
id="toggle-off">
</g>
<g
id="shredder">
</g>
<g
id="spinner--loading--dots-"
serif:id="spinner [loading, dots]">
</g>
<g
id="react">
</g>
<g
id="check-selected">
</g>
<g
id="turn-off">
</g>
<g
id="code-block">
</g>
<g
id="user">
</g>
<g
id="coffee-bean">
</g>
<g
transform="matrix(0.638317,0.368532,-0.368532,0.638317,785.021,-208.975)"
id="g1">
<g
id="coffee-beans">
<g
id="coffee-bean1"
serif:id="coffee-bean">
</g>
</g>
</g>
<g
id="coffee-bean-filled"
transform="matrix(0.866025,0.5,-0.5,0.866025,717.879,-387.292)">
<g
transform="matrix(1,0,0,1,0,-0.699553)"
id="g2">
<path
d="M737.673,328.231C738.494,328.056 739.334,328.427 739.757,329.152C739.955,329.463 740.106,329.722 740.106,329.722C740.106,329.722 745.206,338.581 739.429,352.782C737.079,358.559 736.492,366.083 738.435,371.679C738.697,372.426 738.482,373.258 737.89,373.784C737.298,374.31 736.447,374.426 735.735,374.077C730.192,371.375 722.028,365.058 722.021,352C722.015,340.226 728.812,330.279 737.673,328.231Z"
id="path1"
style="fill:#3e2723;fill-opacity:1" />
</g>
<g
transform="matrix(-1,0,0,-1,1483.03,703.293)"
id="g3">
<path
d="M737.609,328.246C738.465,328.06 739.344,328.446 739.785,329.203C739.97,329.49 740.106,329.722 740.106,329.722C740.106,329.722 745.206,338.581 739.429,352.782C737.1,358.507 736.503,365.948 738.383,371.527C738.646,372.304 738.415,373.164 737.796,373.703C737.177,374.243 736.294,374.356 735.56,373.989C730.02,371.241 722.028,364.92 722.021,352C722.016,340.255 728.779,330.328 737.609,328.246Z"
id="path2"
style="stroke:#3e2723;stroke-opacity:1;fill:#3e2723;fill-opacity:1" />
</g>
</g>
<g
transform="matrix(0.638317,0.368532,-0.368532,0.638317,913.062,-208.975)"
id="g4">
<g
id="coffee-beans-filled">
<g
id="coffee-bean2"
serif:id="coffee-bean">
</g>
</g>
</g>
<g
id="clipboard">
</g>
<g
transform="matrix(1,0,0,1,128.011,1.35415)"
id="g5">
<g
id="clipboard-paste">
</g>
</g>
<g
id="clipboard-copy">
</g>
<g
id="Layer1">
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.4 KiB

+224
View File
@@ -0,0 +1,224 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg
fill="#000000"
width="800px"
height="800px"
viewBox="0 0 64 64"
version="1.1"
xml:space="preserve"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"
id="svg6"
sodipodi:docname="bean_light_brown.svg"
inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:serif="http://www.serif.com/"><defs
id="defs6" /><sodipodi:namedview
id="namedview6"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="1.075"
inkscape:cx="400"
inkscape:cy="400"
inkscape:window-width="1920"
inkscape:window-height="1129"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg6" />
<g
transform="matrix(1,0,0,1,-1152,-256)"
id="g6">
<rect
id="Icons"
x="0"
y="0"
width="1280"
height="800"
style="fill:none;" />
<g
id="Icons1"
serif:id="Icons">
<g
id="Strike">
</g>
<g
id="H1">
</g>
<g
id="H2">
</g>
<g
id="H3">
</g>
<g
id="list-ul">
</g>
<g
id="hamburger-1">
</g>
<g
id="hamburger-2">
</g>
<g
id="list-ol">
</g>
<g
id="list-task">
</g>
<g
id="trash">
</g>
<g
id="vertical-menu">
</g>
<g
id="horizontal-menu">
</g>
<g
id="sidebar-2">
</g>
<g
id="Pen">
</g>
<g
id="Pen1"
serif:id="Pen">
</g>
<g
id="clock">
</g>
<g
id="external-link">
</g>
<g
id="hr">
</g>
<g
id="info">
</g>
<g
id="warning">
</g>
<g
id="plus-circle">
</g>
<g
id="minus-circle">
</g>
<g
id="vue">
</g>
<g
id="cog">
</g>
<g
id="logo">
</g>
<g
id="radio-check">
</g>
<g
id="eye-slash">
</g>
<g
id="eye">
</g>
<g
id="toggle-off">
</g>
<g
id="shredder">
</g>
<g
id="spinner--loading--dots-"
serif:id="spinner [loading, dots]">
</g>
<g
id="react">
</g>
<g
id="check-selected">
</g>
<g
id="turn-off">
</g>
<g
id="code-block">
</g>
<g
id="user">
</g>
<g
id="coffee-bean">
</g>
<g
transform="matrix(0.638317,0.368532,-0.368532,0.638317,785.021,-208.975)"
id="g1">
<g
id="coffee-beans">
<g
id="coffee-bean1"
serif:id="coffee-bean">
</g>
</g>
</g>
<g
id="coffee-bean-filled"
transform="matrix(0.866025,0.5,-0.5,0.866025,717.879,-387.292)">
<g
transform="matrix(1,0,0,1,0,-0.699553)"
id="g2">
<path
d="M737.673,328.231C738.494,328.056 739.334,328.427 739.757,329.152C739.955,329.463 740.106,329.722 740.106,329.722C740.106,329.722 745.206,338.581 739.429,352.782C737.079,358.559 736.492,366.083 738.435,371.679C738.697,372.426 738.482,373.258 737.89,373.784C737.298,374.31 736.447,374.426 735.735,374.077C730.192,371.375 722.028,365.058 722.021,352C722.015,340.226 728.812,330.279 737.673,328.231Z"
id="path1"
style="fill:#5d4037;fill-opacity:1" />
</g>
<g
transform="matrix(-1,0,0,-1,1483.03,703.293)"
id="g3">
<path
d="M737.609,328.246C738.465,328.06 739.344,328.446 739.785,329.203C739.97,329.49 740.106,329.722 740.106,329.722C740.106,329.722 745.206,338.581 739.429,352.782C737.1,358.507 736.503,365.948 738.383,371.527C738.646,372.304 738.415,373.164 737.796,373.703C737.177,374.243 736.294,374.356 735.56,373.989C730.02,371.241 722.028,364.92 722.021,352C722.016,340.255 728.779,330.328 737.609,328.246Z"
id="path2"
style="stroke:#5d4037;stroke-opacity:1;fill:#5d4037;fill-opacity:1" />
</g>
</g>
<g
transform="matrix(0.638317,0.368532,-0.368532,0.638317,913.062,-208.975)"
id="g4">
<g
id="coffee-beans-filled">
<g
id="coffee-bean2"
serif:id="coffee-bean">
</g>
</g>
</g>
<g
id="clipboard">
</g>
<g
transform="matrix(1,0,0,1,128.011,1.35415)"
id="g5">
<g
id="clipboard-paste">
</g>
</g>
<g
id="clipboard-copy">
</g>
<g
id="Layer1">
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.4 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

+116
View File
@@ -0,0 +1,116 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="124.8711mm"
height="31.440542mm"
viewBox="0 0 124.8711 31.440542"
version="1.1"
id="svg1"
inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
sodipodi:docname="logo.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
inkscape:zoom="0.70021044"
inkscape:cx="329.90082"
inkscape:cy="345.61039"
inkscape:window-width="1920"
inkscape:window-height="1046"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs1" />
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-17.727083,-56.885417)">
<g
id="g5"
transform="matrix(0.26458333,0,0,0.26458333,-67.310852,25.675979)">
<text
id="text5"
xml:space="preserve"
transform="matrix(1.3333333,0,0,1.3333333,316.00667,186.29426)"><tspan
id="tspan5"
style="font-variant:normal;font-weight:700;font-size:65.991px;font-family:'Noto Sans';writing-mode:lr-tb;fill:#3e2723;fill-opacity:1;fill-rule:nonzero;stroke:#3e2723;stroke-width:2.19965;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
x="0"
y="0">my</tspan></text>
<text
id="text6"
xml:space="preserve"
transform="matrix(1.3333333,0,0,1.3333333,452.48533,186.29426)"><tspan
id="tspan6"
style="font-variant:normal;font-weight:700;font-size:65.991px;font-family:'Noto Sans';writing-mode:lr-tb;fill:#e65100;fill-opacity:1;fill-rule:nonzero;stroke:#e65100;stroke-width:2.19965;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
x="0"
y="0">-</tspan></text>
<text
id="text7"
xml:space="preserve"
transform="matrix(1.3333333,0,0,1.3333333,480.79333,186.29426)"><tspan
id="tspan7"
style="font-variant:normal;font-weight:700;font-size:65.991px;font-family:'Noto Sans';writing-mode:lr-tb;fill:#3e2723;fill-opacity:1;fill-rule:nonzero;stroke:#3e2723;stroke-width:2.19965;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
x="0"
y="0">biz</tspan></text>
<text
id="text8"
xml:space="preserve"
transform="matrix(1.3333333,0,0,1.3333333,606.236,186.29426)"><tspan
id="tspan8"
style="font-variant:normal;font-weight:700;font-size:65.991px;font-family:'Noto Sans';writing-mode:lr-tb;fill:#e65100;fill-opacity:1;fill-rule:nonzero;stroke:#e65100;stroke-width:2.19965;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
x="0"
y="0">.app</tspan></text>
</g>
<g
id="g8"
transform="matrix(0.26458333,0,0,0.26458333,-67.310852,25.675979)">
<path
id="path8"
d="M 249.449,279.212 H 391.181"
style="fill:none;stroke:#e65100;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
transform="matrix(1.3333333,0,0,-1.3333333,0,595.27559)" />
</g>
<g
id="g9"
transform="matrix(0.26458333,0,0,0.26458333,-67.310852,25.675979)">
<path
id="path9"
d="M 442.205,279.212 H 583.937"
style="fill:none;stroke:#e65100;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
transform="matrix(1.3333333,0,0,-1.3333333,0,595.27559)" />
</g>
<g
id="g10"
transform="matrix(0.26458333,0,0,0.26458333,-67.310852,25.675979)">
<path
id="path10"
d="m 420.661,289.332 c 0.369,-0.114 0.596,-0.454 0.596,-0.822 0.028,-0.171 0.028,-0.284 0.028,-0.284 0,0 -0.028,-4.535 -5.386,-8.702 -2.182,-1.701 -4.053,-4.451 -4.564,-7.03 -0.056,-0.34 -0.311,-0.624 -0.652,-0.681 -0.368,-0.085 -0.708,0.057 -0.907,0.369 -1.53,2.268 -3.259,6.491 -0.368,11.48 2.608,4.536 7.427,6.832 11.253,5.67 z"
style="fill:#3e2723;fill-opacity:1;fill-rule:evenodd;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,595.27559)" />
<path
id="path11"
d="m 413.121,269.376 c -0.368,0.141 -0.623,0.482 -0.623,0.85 0,0.17 0,0.284 0,0.284 0,0 0,4.535 5.357,8.702 2.154,1.672 4.054,4.394 4.564,6.945 0.057,0.368 0.34,0.623 0.709,0.708 0.34,0.057 0.708,-0.085 0.907,-0.396 1.53,-2.268 3.174,-6.463 0.34,-11.424 -2.608,-4.507 -7.399,-6.803 -11.254,-5.669 z"
style="fill:#3e2723;fill-opacity:1;fill-rule:evenodd;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,595.27559)" />
<path
id="path12"
d="m 413.121,269.376 c -0.368,0.141 -0.623,0.482 -0.623,0.85 0,0.17 0,0.284 0,0.284 0,0 0,4.535 5.357,8.702 2.154,1.672 4.054,4.394 4.564,6.945 0.057,0.368 0.34,0.623 0.709,0.708 0.34,0.057 0.708,-0.085 0.907,-0.396 1.53,-2.268 3.174,-6.463 0.34,-11.424 -2.608,-4.507 -7.399,-6.803 -11.254,-5.669 z"
style="fill:none;stroke:#3e2723;stroke-width:0.4428;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
transform="matrix(1.3333333,0,0,-1.3333333,0,595.27559)" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.8 KiB

+4601 -553
View File
File diff suppressed because it is too large Load Diff
-1025
View File
File diff suppressed because it is too large Load Diff
-22
View File
@@ -1,22 +0,0 @@
{
"name": "ngo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"build:css": "tailwindcss -i src/input.css -o assets/site.css --minify",
"watch:css": "tailwindcss -i src/input.css -o assets/site.css --watch",
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git@git.odoo4projects.com:Oliver/NGO.git"
},
"keywords": [],
"author": "",
"license": "ISC",
"type": "commonjs",
"devDependencies": {
"tailwindcss": "^3.4.17"
}
}
+47
View File
File diff suppressed because one or more lines are too long
View File
+1
View File
@@ -0,0 +1 @@
{"area": "CRM", "Vertical": "NGO", "date": "2026-05-04", "title": "Impact Reporting in Minutes", "teaser": "Small NGOs waste countless hours turning donor data into reports—instead of serving those theyre meant to help.", "content": "<article>\n<h2>Impact Reporting in Minutes</h2>\n<p style=\"margin: 0; color: #374151;\">— \"Maria stared at her screen at 11 p.m., three days before the grant deadline. Her donor database had 872 entries. Excel had 14 tabs. She hadnt slept in 36 hours. Every email from a donor—How was the clean water project?—demanded a new report. She couldnt tell them. Not without weeks of work. <strong>Spreadsheets</strong> were drowning her. <strong>Manual reporting</strong> was stealing her purpose. And worst of all—she knew donors were slipping away, not because her work wasnt impactful, but because she couldnt prove it.\" —</p>\n\n<p style=\"margin: 0; color: #374151;\">Modern digital tools can transform how NGOs capture and communicate impact. Automated systems can pull data from donations, program logs, and field reports into unified dashboards. Reports once built by hand can now be generated with a single click, reducing errors, saving weeks of labor, and preserving the emotional integrity of the stories behind the numbers.</p>\n\n<h3>Stop drowning in spreadsheets. Start telling stories.</h3>\n<p style=\"margin: 0; color: #374151;\">When your team spends 20 hours a week just compiling donor data, youre not serving beneficiaries—youre serving Excel. Automated reporting tools reset that balance. They sync with your existing donation platforms, track program outcomes across locations, and turn fragmented inputs into cohesive, real-time narratives that donors actually read.</p>\n\n<h3>Trust isnt built with PDFs. Its built with clarity.</h3>\n<p style=\"margin: 0; color: #374151;\">Donors dont want line items. They want to know lives changed. A clean, automated dashboard shows a childs progress in school, not just the $50 spent on textbooks. When you can show, not tell, donors see their values reflected in real results. Thats how <strong>retention grows</strong>—not through emails begging for more, but through transparency that feels genuine.</p>\n\n<h3>Proof that matters. Without the panic.</h3>\n<p style=\"margin: 0; color: #374151;\">Grant applications and board reviews require compliance—not creativity. When audit season rolls around, having pre-built, audit-ready templates means your finance lead isnt working through the night. No more frantic last-minute data fixes. Just a few clicks, and your compliance is done. That peace of mind? Its priceless.</p>\n\n<div class=\"video-container\" style=\"display: flex; margin: 2rem 0; gap: 2rem;\">\n <div class=\"video-text\" style=\"flex: 1;\">\n <p style=\"margin: 0; color: #374151;\">This is how you generate an impact report for your donors—no more spreadsheets, no more stress. Just one click, and your story goes live.</p>\n </div>\n <div class=\"video-player\" style=\"flex: 1; min-width: 300px; height: 300px;\">\n <iframe width=\"100%\" height=\"100%\"\n src=\"https://www.youtube.com/embed/huVrXvkCAqg\"\n title=\"YouTube video player\"\n frameborder=\"0\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowfullscreen\n style=\"width: 100%; height: 100%; border-radius: 8px;\">\n </iframe>\n </div>\n</div>\n\n<p style=\"margin: 0; color: #374151;\"><em>Remember: Every hour you spend wrestling with data is an hour taken from the field, the classroom, the clinic.</em></p>\n\n<a class=\"cta\" href=\"https://calendar.google.com/calendar/u/0/appointments/schedules/AcZssZ3DDbaiHFlhNhWySszAQoPXE_H73QLqYT3w7H9IYWC76RA_TgNIhLESjb4N7ep_D2D_OyW9q4-c\">When you want to explore how this could work for your organization, you can book a meeting here:</a>\n</article>", "image": "ngo_office3"}
View File
-17
View File
@@ -1,17 +0,0 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
body {
@apply font-brand;
}
#lang-selector {
color: #ffffff;
}
#lang-selector:focus,
#lang-selector:focus-visible {
color: #201824;
background-color: #ffffff;
}
+1630
View File
File diff suppressed because it is too large Load Diff
-27
View File
@@ -1,27 +0,0 @@
/** @type {import('tailwindcss').Config} */
module.exports = {
content: ['./index.html'],
theme: {
extend: {
colors: {
'brand-ink': '#201824',
'brand-primary': '#603F57',
'brand-accent': '#F762B4',
'brand-sunrise': '#F8B84A',
'brand-emerald': '#39B982',
'brand-snow': '#F5F2F7',
'brand-smoke': '#E5DCE8'
},
fontFamily: {
brand: ['Inter', 'Segoe UI', 'system-ui', 'sans-serif']
},
boxShadow: {
brand: '0 20px 60px rgba(32, 24, 36, 0.15)'
},
backgroundImage: {
'hero-gradient': 'radial-gradient(circle at top left, rgba(247,98,180,0.35), rgba(32,24,36,0.95))'
}
}
},
plugins: []
};