Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7d5b7a3e14 | ||
|
|
d5630b0df9 | ||
|
|
68a4f9544c |
No files matched your search
-21
@@ -1,21 +0,0 @@
|
||||
# Dependencies
|
||||
node_modules/
|
||||
|
||||
# Tailwind build temp
|
||||
tmp.json
|
||||
|
||||
# Logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# OS
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# Editor
|
||||
.vscode/
|
||||
.idea/
|
||||
*.swp
|
||||
*.swo
|
||||
@@ -1,233 +0,0 @@
|
||||
# AGENTS.md — NGO Landing Page
|
||||
|
||||
Read this file fully before taking any action.
|
||||
|
||||
---
|
||||
|
||||
## Project Context
|
||||
|
||||
Single-page static landing page for an NGO ERP product.
|
||||
|
||||
| Item | Detail |
|
||||
|---|---|
|
||||
| Pages | `index.html` — the only HTML file |
|
||||
| Styling | Tailwind CSS v3 · source `src/input.css` → compiled `assets/site.css` |
|
||||
| Data | `blog.json` — flat array of blog posts, loaded at runtime by inline JS |
|
||||
| i18n | Inline `translations` object inside `index.html` (EN / ES / DE) |
|
||||
| Blog renderer | Inline `<script>` in `index.html` — no external JS files |
|
||||
| Dev server | `./start` (runs `live-server`) |
|
||||
| Git remote | `git@git.odoo4projects.com:Oliver/NGO.git` |
|
||||
|
||||
### File map
|
||||
|
||||
```
|
||||
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 ← 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)
|
||||
```
|
||||
|
||||
### Design tokens (from `tailwind.config.js`)
|
||||
|
||||
| Token | Hex | Usage |
|
||||
|---|---|---|
|
||||
| `brand-ink` | `#201824` | default text / dark backgrounds |
|
||||
| `brand-primary` | `#603F57` | section labels, bullet accents |
|
||||
| `brand-accent` | `#F762B4` | CTA buttons, links |
|
||||
| `brand-sunrise` | `#F8B84A` | hero highlights, hover states |
|
||||
| `brand-emerald` | `#39B982` | positive indicators |
|
||||
| `brand-snow` | `#F5F2F7` | page background |
|
||||
| `brand-smoke` | `#E5DCE8` | borders, subtle dividers |
|
||||
|
||||
NEVER use raw hex values in HTML — always use the token class names above.
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Goal
|
||||
|
||||
- Deliver an **SEO-optimised, fast-loading, responsive** single-page site.
|
||||
- Keep all edits **minimal and targeted** — preserve design, structure, and functionality.
|
||||
- NEVER introduce new frameworks, libraries, or external dependencies.
|
||||
|
||||
### Quality bar for every change
|
||||
|
||||
| Concern | Rule |
|
||||
|---|---|
|
||||
| SEO | Keep all existing meta tags, `ld+json`, `alt` attributes, and heading hierarchy |
|
||||
| Performance | No comments in production HTML, no unused CSS classes, no render-blocking additions |
|
||||
| Responsive | Every element must work on mobile (375 px), tablet (768 px), and desktop (1280 px+) |
|
||||
| Consistency | Use only brand token classes; match existing spacing and rounding patterns |
|
||||
|
||||
---
|
||||
|
||||
## Commands
|
||||
|
||||
```bash
|
||||
# Build CSS after editing src/input.css or tailwind.config.js
|
||||
npm run build:css
|
||||
|
||||
# Watch CSS during active development
|
||||
npm run watch:css
|
||||
|
||||
# Validate blog.json
|
||||
jq empty blog.json && echo "JSON valid"
|
||||
|
||||
# Start dev server
|
||||
./start
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Git Rules
|
||||
|
||||
- ALWAYS work on **`main`** branch.
|
||||
- Pull before every session:
|
||||
```bash
|
||||
git pull origin main
|
||||
```
|
||||
- Commit messages must follow the pattern:
|
||||
- `blog: add post – <title>`
|
||||
- `fix: <short description>`
|
||||
- `content: <short description>`
|
||||
- Push immediately after committing — never leave unpushed commits.
|
||||
- Branch creation is permitted ONLY under the **Branch Handling Exception** (see bottom).
|
||||
|
||||
---
|
||||
|
||||
## File Safety Rules
|
||||
|
||||
- ONLY modify files required for the task.
|
||||
- NEVER delete or restructure content unrelated to the task.
|
||||
- NEVER remove existing blog posts from `blog.json`.
|
||||
- NEVER edit `assets/site.css` directly — always rebuild from `src/input.css`.
|
||||
|
||||
---
|
||||
|
||||
## Blog Post Schema
|
||||
|
||||
### 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
|
||||
[
|
||||
{
|
||||
"area": "Automation",
|
||||
"date": "2026-03-25",
|
||||
"title": "Article title as plain text",
|
||||
"teaser": "<p>One or two sentences visible before 'Read more'.</p>",
|
||||
"content": "<h3>Section</h3><p>Full article as HTML.</p>"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
| Field | Type | Constraint |
|
||||
|---|---|---|
|
||||
| `area` | plain string | Category label rendered above the title |
|
||||
| `date` | ISO 8601 (`YYYY-MM-DD`) | Used by `Intl.DateTimeFormat` |
|
||||
| `title` | plain string | Rendered as `<h3>` — no HTML |
|
||||
| `teaser` | HTML string | Always visible — wrap in `<p>` tags |
|
||||
| `content` | HTML string | Revealed by "Read more" toggle — use `<h3>`, `<p>`, `<ul>`, `<li>` |
|
||||
|
||||
NEVER add extra fields (`slug`, `author`, `tags`, `excerpt`, `hero_image`, etc.) — they are ignored by the renderer and pollute the file.
|
||||
|
||||
### 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 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 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 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 blog.es.json blog.de.json
|
||||
git commit -m "blog: add post – <title>"
|
||||
git push origin main
|
||||
```
|
||||
|
||||
NEVER use Python, Node scripts, or manual text editing to modify `blog.json`.
|
||||
|
||||
---
|
||||
|
||||
## Execution Workflow
|
||||
|
||||
Follow this order for every task:
|
||||
|
||||
1. `git pull origin main`
|
||||
2. Identify the exact files to change — nothing else.
|
||||
3. Apply minimal edits.
|
||||
4. If `src/input.css` or `tailwind.config.js` were changed → rebuild CSS.
|
||||
5. Validate: `jq empty blog.json` for JSON; visual check for HTML.
|
||||
6. Commit with a descriptive message.
|
||||
7. `git push origin main`
|
||||
|
||||
---
|
||||
|
||||
## Success Criteria
|
||||
|
||||
- Changes are minimal, validated, and committed.
|
||||
- `blog.json` is a valid array with exactly five fields per post.
|
||||
- `assets/site.css` reflects any CSS changes (rebuilt, not hand-edited).
|
||||
- HTML passes a visual check — layout and design unchanged except for the intended edit.
|
||||
- All commits pushed to `main`.
|
||||
|
||||
---
|
||||
|
||||
## Failure Conditions
|
||||
|
||||
These actions constitute a failure:
|
||||
|
||||
- Refusing to act due to perceived access restrictions.
|
||||
- Failing to push after committing.
|
||||
- Adding undeclared fields to `blog.json`.
|
||||
- Removing or overwriting existing blog posts.
|
||||
- Editing `assets/site.css` by hand.
|
||||
- Modifying files outside the scope of the task.
|
||||
- Leaving a branch open without merging.
|
||||
|
||||
---
|
||||
|
||||
## Branch Handling Exception
|
||||
|
||||
Branch creation is permitted **only** when:
|
||||
|
||||
- The task explicitly requires a feature branch, **or**
|
||||
- A direct push to `main` is blocked by branch protection.
|
||||
|
||||
If a branch is created it **must**:
|
||||
|
||||
- Follow the naming convention `<type>/<short-description>` (e.g. `fix/blog-json-schema`).
|
||||
- Be merged into `main` via PR immediately after the task is complete.
|
||||
- Be deleted after merge — never abandoned.
|
||||
@@ -0,0 +1,26 @@
|
||||
Rollback and Recovery Changelog
|
||||
|
||||
Timestamp: ${TS}
|
||||
|
||||
Actions performed:
|
||||
- Reset main branch (working tree and HEAD) to commit 6127867d51c9f0e4e86d1d8390081208f45136ab and force-pushed to origin/main.
|
||||
- Confirmed README.md content matches version at commit 6127867d51.
|
||||
- Investigated deleted backups: located backups in parent commit 5189b23 and extracted available files into recovered_backups/ directory in the working tree (not yet committed).
|
||||
- Created this changelog and saved recovered backup files under recovered_backups/ for review.
|
||||
|
||||
Recovered backup files:
|
||||
- backups/index.html.20260324164129.bak -> recovered_backups/index.html.20260324164129.bak (extracted from commit 5189b23)
|
||||
- backups/index.html.bak.20260324164053 -> recovered_backups/index.html.bak.20260324164053 (extracted from commit 5189b23)
|
||||
|
||||
Notes on recovery:
|
||||
- The deleted backup files were present in previous commits and have been extracted from git history into recovered_backups/.
|
||||
- Additional backup files referencing other timestamps exist in git history (e.g., backups/index.html.20260324164556.bak and backups/index.html.20260324164626.bak). These can be extracted on request.
|
||||
|
||||
Suspicious findings:
|
||||
- Commit 6127867d51 (message: "Deleted Backups and changed readme") removed backup files. Author: Oliver. This commit may be responsible for missing backups. Please confirm whether this deletion was authorized.
|
||||
|
||||
Remaining tasks / recommendations:
|
||||
- Decide whether to reintroduce recovered backups into main branch. Restoring them to main will create a new commit on top of 6127867d51 (this changelog can be used), or they can be provided in a separate branch or as artifacts.
|
||||
- If you want me to commit the recovered_backups/ content and this changelog to the repository and push, confirm and I will proceed.
|
||||
- If you prefer the repository to remain exactly at 6127867d51 (no additional commits), I will not commit recovered files; instead I will provide them separately (download/attach) and leave main at the rollback state.
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
# NGO Website — ODOO4projects
|
||||
|
||||
**Project:** NGO marketing homepage and blog
|
||||
**URL:** [ngo.odoo4projects.com](https://ngo.odoo4projects.com)
|
||||
**Stack:** Static HTML · Tailwind CSS · Vanilla JS
|
||||
|
||||
---
|
||||
|
||||
## Repository Rules
|
||||
|
||||
- Blog posts live in `blog.json` — do not create separate backup files.
|
||||
- No backup files in the repo.
|
||||
- Update this README with every commit.
|
||||
|
||||
---
|
||||
|
||||
## 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 |
|
||||
|
||||
---
|
||||
|
||||
## CI Checks (required on every push)
|
||||
|
||||
- **HTML lint** — valid markup, no broken anchors
|
||||
- **JS lint** — no errors, no `console.error` left in production paths
|
||||
- **Tailwind build** — `npx tailwindcss -i ./src/input.css -o ./assets/site.css --minify` must exit 0
|
||||
- **Corporate design compliance:**
|
||||
- No CSS gradients — `gradient`, `bg-*-gradient`, `linear-gradient`, `radial-gradient` are forbidden
|
||||
- No CSS animations or keyframes — `animate-*`, `@keyframes`, transform-based `hover:translate-*` are forbidden
|
||||
- No blur or glassmorphism effects — `backdrop-blur`, `backdrop-filter` are forbidden
|
||||
- Colors must use the approved brand palette only: `brand-ink · brand-primary · brand-accent · brand-sunrise · brand-emerald · brand-snow · brand-smoke`
|
||||
- Images must be served from `odoo4projects.com`, `images.unsplash.com`, or local `assets/`
|
||||
- **Accessibility** — heading hierarchy (one `<h1>` per page), `alt` on all images, sufficient contrast (WCAG AA)
|
||||
- **Performance budget** — total page weight ≤ 200 KB (excluding cached fonts); critical render path ≤ 1 s on fast 3G
|
||||
- **SEO** — `<title>`, `<meta name="description">`, `<h1>`, canonical `<link>`, and JSON-LD structured data must be present
|
||||
|
||||
---
|
||||
|
||||
## Languages
|
||||
|
||||
| Code | Language |
|
||||
|------|----------|
|
||||
| `en` | English (default) |
|
||||
| `es` | Español |
|
||||
| `de` | Deutsch |
|
||||
|
||||
All UI strings are managed via the inline `translations` object in `index.html`.
|
||||
|
||||
---
|
||||
|
||||
## Focus Keywords
|
||||
|
||||
`NGO donor management` · `transparent donations` · `Odoo for NGOs` · `donor communication` · `minimal admin for charities`
|
||||
@@ -0,0 +1 @@
|
||||
*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.absolute{position:absolute}.relative{position:relative}.-bottom-8{bottom:-2rem}.left-8{left:2rem}.mx-autoLine truncated
|
||||
@@ -0,0 +1,22 @@
|
||||
[
|
||||
{
|
||||
"area": "Donor Management",
|
||||
"title": "From Notebooks to Night Off: How One NGO Cut Reconciliation Time in Half",
|
||||
"teaser": "<p>Ana replaced stacks of notebooks with a single shared ledger and reclaimed her evenings.</p>",
|
||||
"content": "\"Ana used to sit under a single lamp with three notebooks stacked and the weight of every donor question on her shoulders. When a donor called she fumbled through pages and felt her chest tighten.\"\n\nAn ERP creates a single source of truth for every donation: each peso is recorded once and linked to allocations, program expenses, receipts, and impact notes, eliminating duplicated spreadsheets and manual cross-checks. Shared dashboards, ownership fields, and due-date tracking make reconciliation predictable and reduce the time teams spend hunting for evidence.\n\nWith Odoo and n8n, donors submit a simple webform that triggers an n8n workflow to create the donation card in Odoo, attach receipts, apply tags, and notify the approver. Approval buttons in Odoo, automated reminder sequences, and scheduled exports or AI summaries transform reconciliation into a short weekly routine and let audit packets assemble automatically.\n\n\"Now Ana closes her laptop at 7 p.m., answers donor queries in seconds from a shared dashboard, and walks home without the knot in her chest — the night no longer belongs to reconciliation but to rest.\"\n\nGet a free trial: https://ngo.odoo4projects.com",
|
||||
"date": "2026-03-24",
|
||||
"slug": "from-notebooks-to-night-off",
|
||||
"author": "Odoo4Projects NGO",
|
||||
"categories": [
|
||||
"Donor Management",
|
||||
"Efficiency"
|
||||
],
|
||||
"tags": [
|
||||
"Odoo",
|
||||
"n8n",
|
||||
"reconciliation",
|
||||
"donor-management"
|
||||
],
|
||||
"meta_description": "How one NGO replaced stacked notebooks with a shared ledger and cut reconciliation time in half using Odoo + n8n."
|
||||
}
|
||||
]
|
||||
BIN
Binary file not shown.
|
Before Width: | Height: | Size: 17 KiB |
@@ -1 +0,0 @@
|
||||
google-site-verification: google261cafffa78d8c3d.html
|
||||
-114
@@ -1,114 +0,0 @@
|
||||
<?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>
|
||||
|
Before Width: | Height: | Size: 4.5 KiB |
@@ -1,224 +0,0 @@
|
||||
<?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>
|
||||
|
Before Width: | Height: | Size: 5.4 KiB |
@@ -1,224 +0,0 @@
|
||||
<?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>
|
||||
|
Before Width: | Height: | Size: 5.4 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 115 KiB |
-116
@@ -1,116 +0,0 @@
|
||||
<?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>
|
||||
|
Before Width: | Height: | Size: 5.8 KiB |
+550
-4598
File diff suppressed because it is too large.
Load diff
Generated
+1027
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"name": "ngo",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"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
@@ -1,47 +0,0 @@
|
||||
[
|
||||
{
|
||||
"area": "CRM",
|
||||
"date": "2026-05-14",
|
||||
"title": "Make Smarter Decisions With Better Data",
|
||||
"teaser": "Elena ran a small health-focused NGO on a shoestring budget — and every funding decision felt like a guess. Her program data lived in three different spreadsheets, her donor reports took days to pull together, and by the time the numbers were ready, the moment to act had already passed.",
|
||||
"content": "<h1>Make Smarter Decisions With Better Data</h1>\n\n<h2>When the data exists but the insight doesn't, every decision is a gamble</h2>\n\n<div style=\"float: right; width: 33%; margin: 0 0 1.5rem 2rem; background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 12px; padding: 0.875rem; box-shadow: 0 2px 8px rgba(0,0,0,0.06);\">\n <div style=\"position: relative; padding-top: 56.25%; border-radius: 8px; overflow: hidden;\">\n <iframe\n src=\"https://www.youtube.com/embed/T70EJBnCpj0\"\n title=\"YouTube video player\"\n frameborder=\"0\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowfullscreen\n style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: none;\">\n </iframe>\n </div>\n <p style=\"margin: 0.6rem 0 0 0; font-size: 0.82rem; color: #6b7280; line-height: 1.4;\">See how custom dashboards and scheduled reports help NGO leaders access the right data at the right moment — without chasing spreadsheets or waiting on analysts.</p>\n</div>\n\n<p style=\"margin: 0; color: #374151;\"><em style=\"font-style: italic; color: #0f172a;\">— \"Elena ran a small health-focused NGO on a shoestring budget — and every funding decision felt like a guess. Her program data lived in three different <strong style=\"font-weight: 700; color: #0f172a;\">spreadsheets</strong>, her donor reports took days to pull together, and by the time the numbers were ready, the moment to act had already passed. Grant reviewers were asking for impact summaries she simply could not produce in time. Her team was doing good work in the field — but on paper, they looked disorganized.\" —</em></p>\n\n<p style=\"margin: 0; color: #374151;\">This is not a technology problem. It is an access problem. The data Elena needed existed — scattered across tabs, files, and half-remembered email threads. The issue was that reaching it required more time and effort than the decision could afford. When accessing data costs more than the decision is worth, leaders stop asking for it. They rely on instinct instead. And for small NGOs accountable to donors, funders, and beneficiaries, that is a risk no one can afford.</p>\n\n<h3>Data that arrives too late is data that doesn't help</h3>\n<p style=\"margin: 0; color: #374151;\">The classic pain in small nonprofits is not a lack of data — it's a lack of <strong style=\"font-weight: 700; color: #0f172a;\">timely data</strong>. Reports are requested, someone spends hours assembling them, and the decision has moved on by the time results arrive. Modern reporting systems solve this by separating the work of <em>building</em> a report from the work of <em>reading</em> it. Dashboards are configured once and then live permanently — no requesting, no waiting, no reconciling.</p>\n\n<h3>The right metrics in front of the right people</h3>\n<p style=\"margin: 0; color: #374151;\">Not everyone in an NGO needs the same view. An Executive Director needs a headline picture of fund allocation and program reach. A Development Officer needs a snapshot of donor retention and campaign performance. A Program Manager needs output tracking by initiative. <strong style=\"font-weight: 700; color: #0f172a;\">Custom dashboards</strong> allow each role to see exactly what drives their decisions — without wading through data that belongs to someone else. This focus removes noise and sharpens judgment.</p>\n\n<h3>Scheduled reports that match your decision rhythm</h3>\n<p style=\"margin: 0; color: #374151;\">Decisions happen on a cycle. Budget reviews, board meetings, grant reporting periods, end-of-campaign summaries — these are predictable moments that deserve prepared insight. <strong style=\"font-weight: 700; color: #0f172a;\">Scheduled reports</strong> deliver the right numbers automatically, timed to land when they are actually needed. Instead of scrambling to build a report the night before a funder call, the report is already there — accurate, up to date, and ready to share.</p>\n\n<h3>From intuition to evidence-based fund allocation</h3>\n<p style=\"margin: 0; color: #374151;\">One of the most important decisions an NGO makes is where to direct limited resources. <em style=\"font-style: italic; color: #0f172a;\">When that decision is made on gut feeling rather than data, programs that underperform quietly drain budgets that could serve beneficiaries better.</em> Integrated reporting tools surface program-level performance metrics alongside financial data, so leaders can see not just what was spent — but what it produced. That is the foundation of credible donor communication and responsible stewardship.</p>\n\n<h3>Donor-ready transparency without the extra workload</h3>\n<p style=\"margin: 0; color: #374151;\">Donors increasingly expect to see the impact of their contributions in clear, concrete terms. Producing that evidence manually is one of the biggest time costs in a smaLine truncated
|
||||
"image": "ngo_campus",
|
||||
"vertical": "NGO"
|
||||
},
|
||||
{
|
||||
"area": "CRM",
|
||||
"date": "2026-05-05",
|
||||
"title": "From Spreadsheet Chaos to Donor-Ready Insights",
|
||||
"teaser": "Amara spent the night before the grant deadline surrounded by printed spreadsheets, donor export files, and three open browser tabs — each one a different piece of the same story she desperately needed to tell her funder by morning.",
|
||||
"content": "<h1>From Spreadsheet Chaos to Donor-Ready Insights</h1>\n\n<h2>When the Data Is There but the Insight Is Buried</h2>\n\n<div style=\"float: right; width: 33%; margin: 0 0 1.5rem 2rem; background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 12px; padding: 0.875rem; box-shadow: 0 2px 8px rgba(0,0,0,0.06);\">\n <div style=\"position: relative; padding-top: 56.25%; border-radius: 8px; overflow: hidden;\">\n <iframe\n src=\"https://www.youtube.com/embed/D01_EK-Fz7U\"\n title=\"YouTube video player\"\n frameborder=\"0\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowfullscreen\n style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: none;\">\n </iframe>\n </div>\n <p style=\"margin: 0.6rem 0 0 0; font-size: 0.82rem; color: #6b7280; line-height: 1.4;\">See how drill-down reports and pivot tables help NGO staff explore donor data and program metrics — and turn raw numbers into clear impact stories for funders.</p>\n</div>\n\n<p style=\"margin: 0; color: #374151;\"><em style=\"font-style: italic; color: #0f172a;\">— \"Amara spent the night before the grant deadline surrounded by printed spreadsheets, donor export files, and three open browser tabs — each one a different piece of the same story she desperately needed to tell her funder by morning. The data was all there, somewhere. But pulling it together meant hours of copy-pasting between <strong style=\"font-weight: 700; color: #0f172a;\">disconnected spreadsheets</strong>, manually reconciling numbers that never quite aligned, and writing a <strong style=\"font-weight: 700; color: #0f172a;\">narrative from scratch</strong> every single reporting cycle. By the time the report was done, she was exhausted — and already dreading the next one.\" —</em></p>\n\n<h3>The Gap Between Data and Insight</h3>\n<p style=\"margin: 0; color: #374151;\">Most small NGOs are not short on data. Donor records, program metrics, expense logs, and activity reports accumulate steadily across platforms and files. The real problem is that <strong style=\"font-weight: 700; color: #0f172a;\">the insight that funders need is buried inside that data</strong> — and reaching it requires technical effort that most program staff simply do not have time for. Questions like \"Which programs delivered the most impact per dollar?\" or \"Which donor segments are most engaged?\" go unanswered not because the answers do not exist, but because accessing them feels out of reach.</p>\n\n<h3>Self-Service Analytics Closes the Gap</h3>\n<p style=\"margin: 0; color: #374151;\">Modern reporting systems are designed to put analytical power directly in the hands of the people who need answers — not just those who can write queries. <strong style=\"font-weight: 700; color: #0f172a;\">Drill-down reports</strong> allow staff to move from a summary figure to the underlying detail in a few clicks, without routing requests through a technical intermediary. Pivot tables make it possible to regroup and reshape data on the fly, revealing patterns that flat exports never surface. The result is that a program manager or development officer can explore their own data independently and arrive at a clear, defensible answer — in minutes rather than days.</p>\n\n<h3>Reporting That Meets Donor Requirements</h3>\n<p style=\"margin: 0; color: #374151;\">Grant compliance reporting follows predictable structures, but building those reports manually each cycle is one of the most time-consuming tasks NGO staff face. <strong style=\"font-weight: 700; color: #0f172a;\">Integrated reporting tools</strong> allow organizations to filter and segment data by program, funding source, time period, or beneficiary group — so the exact slice a donor or auditor needs can be assembled quickly and consistently. When the same underlying data powers multiple report formats, there is no reconciliation step, no version mismatch, and no last-minute panic the night before a submission deadline.</p>\n\n<h3>Freeing Staff to Focus on the Mission</h3>\n<p style=\"margin: 0; color: #374151;\">Every hour a small NGO team spends wrestling with <em style=\"font-style: italic; color: #0f172a;\">manual data aggregation</em> is an hour not spent on program delivery, donor relationships, or field work. When reporting becomes a self-service process rather than a multi-day project, that time is genuinely recovered. <strong style=\"font-weight: 700; color: #0f172a;\">Staff stop being data wranglers and go back to being mission-driven professionals</strong> — which is what they were hired to be, and what donors are ultimately funding.</p>\n\n<h3>Impact Visibility Builds Donor Trust</h3>\n<p style=\"margin: 0; color: #374151;\">Transparency is not just a compliance requirement — it is a fundraising asset. When an organization can produce clear, data-backed impact summaries quickly and consistently, it signaLine truncated
|
||||
"image": "ngo_office",
|
||||
"vertical": "NGO"
|
||||
},
|
||||
{
|
||||
"area": "CRM",
|
||||
"vertical": "NGO",
|
||||
"date": "2026-04-30",
|
||||
"title": "Never Lose a Donor Again: Track Every Relationship with Ease",
|
||||
"teaser": "Maria managed development for a small health NGO. Her donor list lived in a spreadsheet she inherited three years ago — rows of names, half-updated phone numbers, and color-coded columns she no longer trusted. Every Monday she'd open it, feel a quiet dread, and wonder who she'd already forgotten.",
|
||||
"content": "<h1>Never Lose a Donor Again: Track Every Relationship with Ease</h1>\n\n<h2>When Good Intentions Aren't Enough to Keep Donors Close</h2>\n\n<div style=\"float: right; width: 33%; margin: 0 0 1.5rem 2rem; background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 12px; padding: 0.875rem; box-shadow: 0 2px 8px rgba(0,0,0,0.06);\">\n <div style=\"position: relative; padding-top: 56.25%; border-radius: 8px; overflow: hidden;\">\n <iframe\n src=\"https://www.youtube.com/embed/y3ZVeeM3WEc\"\n title=\"YouTube video player\"\n frameborder=\"0\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowfullscreen\n style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: none;\"\n ></iframe>\n </div>\n <p style=\"margin: 0.6rem 0 0 0; font-size: 0.82rem; color: #6b7280; line-height: 1.4;\">See how a centralized donor pipeline helps small NGOs track every relationship, log every conversation, and ensure no supporter is ever forgotten.</p>\n</div>\n\n<p style=\"margin: 0; color: #374151;\"><em style=\"font-style: italic; color: #0f172a;\">— \"Maria managed development for a small health NGO. Her donor list lived in a spreadsheet she inherited three years ago — rows of names, half-updated phone numbers, and color-coded columns she no longer trusted. Every Monday she'd open it, feel a quiet dread, and wonder who she'd already forgotten. A major foundation had emailed twice in the autumn. She'd meant to follow up. By the time she remembered, they'd funded someone else. The grant was gone, and no one in the organization ever knew it had been possible.\" —</em></p>\n\n<h3>The Invisible Attrition Draining Your Mission</h3>\n<p style=\"margin: 0; color: #374151;\">For small NGOs, donor relationships are the lifeblood of every program delivered. Yet <strong style=\"font-weight: 700; color: #0f172a;\">the most damaging losses rarely appear on any report</strong> — they are the prospects who showed interest and then quietly faded, the lapsed donors who needed one timely call, the warm introductions that were never followed up. When donor tracking lives across <b>spreadsheets</b>, <b>email inboxes</b>, and individual staff memory, this invisible attrition compounds silently with every passing week.</p>\n\n<h3>A Single Source of Truth for Every Donor Relationship</h3>\n<p style=\"margin: 0; color: #374151;\">Modern CRM systems solve the foundational problem: <strong style=\"font-weight: 700; color: #0f172a;\">every donor, prospect, and foundation contact lives in one centralized place</strong>, accessible to the whole team. No more siloed notes in personal inboxes. No more guessing who last spoke to a major donor or what was discussed. Each record holds the full relationship history — giving history, meeting notes, email threads, and upcoming follow-ups — so any development officer can pick up where a colleague left off without losing context or momentum.</p>\n\n<h3>Follow-Up Reminders That Work the Way Memory Never Could</h3>\n<p style=\"margin: 0; color: #374151;\">The most common reason a donor goes cold is not disinterest — <em style=\"font-style: italic; color: #0f172a;\">it is simply that no one reached out at the right moment</em>. Automated follow-up reminders change this by prompting your team before an opportunity slips. Whether it is a pledge that needs acknowledging, a lapsed donor approaching their anniversary, or a foundation grant cycle opening, <strong style=\"font-weight: 700; color: #0f172a;\">the system surfaces the right action at the right time</strong> — without relying on anyone's memory to do it.</p>\n\n<h3>Interaction Logging That Builds Genuine Relationships</h3>\n<p style=\"margin: 0; color: #374151;\">Donors give more — and give longer — when they feel known. Logging every interaction, from a brief phone call to a formal site visit, ensures that <strong style=\"font-weight: 700; color: #0f172a;\">each conversation builds on the last</strong>. Development officers no longer walk into calls cold or ask a supporter to repeat their story. This continuity signals respect and care, which is precisely what converts a one-time gift into a multi-year relationship. For a small NGO with limited staff, that depth of stewardship is a genuine competitive advantage.</p>\n\n<h3>Streamlined Workflows That Let Your Team Focus on the Mission</h3>\n<p style=\"margin: 0; color: #374151;\">When donor tracking is systematic rather than manual, the time savings are real. Development officers spend less time hunting through old emails and more time having meaningful conversations. Executive Directors gain a clear view of the pipeline — which prospects are warm, which relationships need attention, which funding is at risk — <strong style=\"font-weight: 700; color: #0f172a;\">without waiting for a Friday status update or a quarterly spreadsheet review</strong>. The whole orLine truncated
|
||||
"image": "ngo_hospital"
|
||||
},
|
||||
{
|
||||
"area": "Project",
|
||||
"date": "2026-04-27",
|
||||
"title": "No One Owned It: How Small NGOs Close the Accountability Gap on Donor Follow-Ups",
|
||||
"teaser": "Maria had managed donor relationships at her small environmental NGO for three years using a colour-coded spreadsheet she'd built herself. It worked — until it didn't. A grant renewal deadline slipped past unnoticed because the follow-up task lived in three different inboxes and belonged to no one in particular.",
|
||||
"content": "<h1>No One Owned It: How Small NGOs Close the Accountability Gap on Donor Follow-Ups</h1>\n\n<h2>When Shared Responsibility Becomes No Responsibility</h2>\n\n<p style=\"margin: 0; color: #374151;\"><em style=\"font-style: italic; color: #0f172a;\">— \"Maria had managed donor relationships at her small environmental NGO for three years using a colour-coded spreadsheet she'd built herself. It worked — until it didn't. A grant renewal deadline slipped past unnoticed because the follow-up task lived in three different inboxes and belonged to no one in particular. The funder sent a polite but firm note. The grant — nearly a third of the annual budget — was not renewed. Nobody had forgotten on purpose. The system just never made it anyone's job.\" —</em></p>\n\n<div style=\"float: right; width: 33%; margin: 0 0 1.5rem 2rem; background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 12px; padding: 0.875rem; box-shadow: 0 2px 8px rgba(0,0,0,0.06);\">\n <div style=\"position: relative; padding-top: 56.25%; border-radius: 8px; overflow: hidden;\">\n <iframe\n src=\"https://www.youtube.com/embed/vyvFgOfBoPI\"\n title=\"YouTube video player\"\n frameborder=\"0\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowfullscreen\n style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: none;\">\n </iframe>\n </div>\n <p style=\"margin: 0.6rem 0 0 0; font-size: 0.82rem; color: #6b7280; line-height: 1.4;\">See how task ownership and deadline tracking work inside a project management module built for small teams managing multiple funders and grant cycles.</p>\n</div>\n\n<p style=\"margin: 0; color: #374151;\">For small NGOs operating with lean teams and tight budgets, this story is painfully familiar. Donor follow-ups, grant reporting milestones, and stewardship check-ins are critical — but when those responsibilities are spread informally across staff, <em style=\"font-style: italic; color: #0f172a;\">shared ownership quietly becomes no ownership</em>. The consequences aren't abstract: missed deadlines erode donor trust, reduce retention, and put funding at risk. The good news is that the problem is structural, not personal — and structural problems have structural solutions.</p>\n\n<div style=\"clear: both;\"></div>\n\n<h3>The Hidden Cost of Informal Accountability</h3>\n\n<p style=\"margin: 0; color: #374151;\">Most small NGO teams don't lack commitment — they lack clarity. When a donor follow-up is discussed in a team meeting but never assigned to a specific person with a specific deadline, it enters a grey zone. <em style=\"font-style: italic; color: #0f172a;\">Everyone assumes someone else has it.</em> Modern task management systems address this directly by making individual ownership explicit at the point of assignment. <strong style=\"font-weight: 700; color: #0f172a;\">Every follow-up, every grant milestone, every stewardship touchpoint is tied to a named person and a due date</strong> — visible to the whole team. The ambiguity that causes missed opportunities is engineered out of the workflow.</p>\n\n<h3>From Mental Load to a Managed System</h3>\n\n<p style=\"margin: 0; color: #374151;\">Fundraising officers and program managers at small NGOs carry enormous cognitive loads. Remembering which donor needs an update, which grant report is due next month, and which funder hasn't heard from the organisation in 90 days is exhausting work that shouldn't live in anyone's head. <strong style=\"font-weight: 700; color: #0f172a;\">Centralised task tracking moves that mental load into a system</strong> — one where due dates send automatic reminders, completion status is visible at a glance, and nothing slips through because the system, not a person's memory, holds the schedule. Staff are freed to focus on relationship-building rather than deadline-chasing.</p>\n\n<h3>Visibility That Builds a Culture of Follow-Through</h3>\n\n<p style=\"margin: 0; color: #374151;\">Accountability isn't just about catching missed tasks — it's about creating an environment where follow-through is the default. <em style=\"font-style: italic; color: #0f172a;\">When progress is invisible, it's easy for tasks to stall quietly.</em> When completion tracking makes every open and closed item visible to managers and peers alike, the culture shifts. Teams can see at a glance which donor touchpoints are on track, which grant deadlines are approaching, and where bottlenecks are forming — before they become crises. <strong style=\"font-weight: 700; color: #0f172a;\">Transparency built into the system replaces the need for constant check-in meetings</strong>, giving small teams back time they can spend on mission delivery.</p>\n\n<h3>Protecting Donor Relationships at Scale</h3>\n\n<p style=\"margin: 0; color: #374151;\">Donor retention is one of the most powerful levers a small NGO has. Retaining an Line truncated
|
||||
"image": "ngo_cowork",
|
||||
"vertical": "NGO"
|
||||
},
|
||||
{
|
||||
"area": "CRM",
|
||||
"date": "2026-04-12",
|
||||
"title": "Never Forget a Donor Again",
|
||||
"teaser": "A conversation happens, an interest is expressed, a follow-up is promised — and then the week gets busy. One month later, your most promising donor has quietly moved on. Donor relationships are not lost through rejection; they are lost through neglect.",
|
||||
"content": "<h1>Never Forget a Donor Again</h1>\n<h2>How Scheduled Follow-Ups Keep Donor Relationships Alive — Before They Quietly Slip Away</h2>\n<p style=\"margin: 0; color: #374151;\">A conversation happens, an interest is expressed, a follow-up is promised — and then the week gets busy. One month later, your most promising donor has quietly moved on. Donor relationships are not lost through rejection; they are lost through neglect.</p>\n\n<div class=\"video-section\" style=\"margin: 2rem 0;\">\n <p style=\"margin: 0 0 1rem 0; color: #374151;\">See how NGOs use CRM activity scheduling to keep every donor touchpoint on track — so no relationship falls through the cracks.</p>\n <div style=\"background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 12px; padding: 1.25rem; box-shadow: 0 2px 8px rgba(0,0,0,0.06);\">\n <div style=\"position: relative; padding-top: 56.25%; border-radius: 8px; overflow: hidden;\">\n <iframe\n src=\"https://www.youtube.com/embed/bPxCRbrbWys\"\n title=\"YouTube video player\"\n frameborder=\"0\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowfullscreen\n style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\">\n </iframe>\n </div>\n </div>\n</div>\n\n<h3>The Donor Who Almost Stayed</h3>\n<p style=\"margin: 0; color: #374151;\"><em style=\"font-style: italic; color: #0f172a;\">— \"Maria managed donor relations for a small humanitarian NGO. After every fundraising event, she left with a notebook full of names, warm conversations, and promises to follow up. Back at the office, grant deadlines and program reports swallowed her days whole. The <strong style=\"font-weight: 700; color: #0f172a;\">notebook collected dust</strong>, her <strong style=\"font-weight: 700; color: #0f172a;\">follow-up emails never got sent</strong>, and one by one, those warm leads went cold. The prospects had not said no — they had simply been forgotten.\" —</em></p>\n\n<h3>Neglect Is a System Problem, Not a People Problem</h3>\n<p style=\"margin: 0; color: #374151;\">Small NGOs are not short on dedication — they are short on bandwidth. When a single development officer juggles grant applications, donor acknowledgements, program coordination, and board reporting, <em style=\"font-style: italic; color: #0f172a;\">relationship follow-up becomes the task that always waits until tomorrow</em>. Modern contact management systems address this directly. By moving follow-up reminders out of notebooks and email drafts and into a structured digital system, organizations ensure that <strong style=\"font-weight: 700; color: #0f172a;\">no committed donor interaction depends on a single person's memory</strong>.</p>\n\n<h3>Building Prospect Memory Into Your Workflow</h3>\n<p style=\"margin: 0; color: #374151;\">CRM platforms designed for relationship-driven organizations allow teams to log every donor interaction and schedule a firm next action before closing the record. A call ends — a follow-up email is scheduled for Thursday. A meeting wraps up — a check-in call is queued for two weeks out. <strong style=\"font-weight: 700; color: #0f172a;\">The system holds the commitment so the fundraiser does not have to</strong>. When reminders surface automatically at the right moment, consistent stewardship becomes a process rather than a personal heroic effort.</p>\n\n<h3>From Inconsistent Outreach to Systematic Stewardship</h3>\n<p style=\"margin: 0; color: #374151;\">Repeat giving is built on trust, and trust is built on feeling remembered. Donors who receive timely, relevant follow-ups — a thank-you note, a program update, a personal check-in — are far more likely to give again. <strong style=\"font-weight: 700; color: #0f172a;\">Systematic nurturing replaces hopeful guesswork</strong> with a visible pipeline of relationships at every stage. Development officers gain clarity on who needs attention today, and executive directors gain confidence that no funding relationship is quietly decaying in a forgotten spreadsheet. 📋</p>\n\n<h3>Less Chaos, More Mission Time</h3>\n<p style=\"margin: 0; color: #374151;\">When donor contact management moves into a centralized system with scheduled activities and next-action reminders, the entire team benefits — not just the person who made the last call. Staff transitions, shared portfolios, and seasonal fundraising surges all become easier to manage. <strong style=\"font-weight: 700; color: #0f172a;\">Time recovered from manual tracking is time returned to program delivery</strong> — which is, ultimately, the reason the organization exists.</p>",
|
||||
"image": "ngo_success",
|
||||
"vertical": "NGO"
|
||||
}
|
||||
]
|
||||
Whitespace-only changes.
@@ -1 +0,0 @@
|
||||
{"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 they’re 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 wasn’t impactful, but because she couldn’t 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, you’re not serving beneficiaries—you’re 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 isn’t built with PDFs. It’s built with clarity.</h3>\n<p style=\"margin: 0; color: #374151;\">Donors don’t want line items. They want to know lives changed. A clean, automated dashboard shows a child’s progress in school, not just the $50 spent on textbooks. When you can show, not tell, donors see their values reflected in real results. That’s 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 isn’t working through the night. No more frantic last-minute data fixes. Just a few clicks, and your compliance is done. That peace of mind? It’s 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"}
|
||||
Whitespace-only changes.
@@ -0,0 +1,17 @@
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
||||
body {
|
||||
font-family: 'Inter', 'Segoe UI', system-ui, sans-serif;
|
||||
}
|
||||
|
||||
#lang-selector {
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
#lang-selector:focus,
|
||||
#lang-selector:focus-visible {
|
||||
color: #201824;
|
||||
background-color: #ffffff;
|
||||
}
|
||||
-1630
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,27 @@
|
||||
/** @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: []
|
||||
};
|
||||
Reference in new issue
Block a user