Donors asking a tree-planting charity where their money goes get an answer at any hour, in either language.
I do not have a live exact number for Kenya to hand.
Asked for a figure it does not hold, it declines. That is the feature.
The situation
How this used to work
We4All plants trees, and not in one place. Greece, Kenya, Uganda, Nigeria, India, the United States, Brazil, Cyprus and more: fifteen countries and counting.
That spread is the whole support problem. Somebody who wants to know whether their donation puts a tree in a burnt Greek hillside or in a Kenyan village is not going to work it out by reading the site end to end. They are going to ask, at whatever hour it occurs to them, in Greek or in English.
The answers already existed. They were just spread across pages, in an organisation whose people are busy planting.
What we built
The system
A chat agent embedded on we4all.com, answering from the organisation's own knowledge, in Greek and in English, all day and all night.
It answers and it does nothing else. No agentic mode, no voice, no file or image generation, no sandbox. All of it is switched off in its configuration, on purpose. The platform can do those things. This deployment is a knowledgeable mouth and nothing more, which is the correct amount of power to hand a stranger on a public web page.
Its knowledge is stacked in a fixed order: the workspace's own briefing first, then the indexed documents, then the website. When two sources disagree, that hierarchy decides, rather than whichever text happened to sound most confident.
It arrives as one script tag and renders inside a shadow DOM, sealed from the host site. A support widget that inherits a stray rule from the page it sits on is how these things quietly break, and one that leaks its styles into a client's site is worse.
How it works
The pipeline, step by step
One script tag, sealed off
A single script from os.liberators.ai, initialised with the organisation's token. Everything the widget draws lives inside its own shadow root, so the site cannot style it and it cannot style the site. The settings endpoint is gated on the origin: a request that does not come from their domain does not get their configuration.
<script src="https://os.liberators.ai/embed.js">
NexusChat.init({ token, apiUrl })One tag, sealed both ways, and a settings call that checks who is asking.
Two documents and a briefing
The knowledge is their site's own content plus a written knowledge pack, both indexed. On top sits a workspace briefing that carries the things a website buries: UN partner status, ISO 9001 and 14001, Candid Platinum, the countries, the team. That briefing outranks everything else it reads.
When two sources disagree, the rank decides and not the tone.
Their programmes, not the internet's
Ask about Kenya and it comes back with the Green Planet initiative, the communities of Mulata, Kitui and Kakongo, the fruit-bearing and medicinal species they plant there, and the goal of five hundred thousand trees for 2026. That is not a general fact about tree planting. That is their work, and it is the difference between a knowledge base and a language model with a friendly greeting.
Two donations, two continents
Plant a Tree in Greece goes to fire-affected and high-priority land. Plant a Tree in the World does not. The agent keeps those apart, because they are the two things a donor is actually choosing between, and getting it wrong sends their money somewhere they did not intend.
There means Kenya
Asked how many have been planted there, two turns after Kenya was last named, it resolves the pronoun and answers about Kenya. Nobody asks their second question in full sentences. An agent that loses the subject makes the visitor do the work it was put there to do.
The instruction, and the proof it holds
Its prompt says never invent statistics. Anyone can write that line. So we pushed it: an exact Kenyan tree count, the one number it would be most tempting to produce. It said it does not have a live exact figure, and stopped. For an organisation whose whole public credibility is a count of trees, an agent that guesses at that count is not a support tool. It is a liability with a launcher button.
Greek, off the same knowledge
The Greek site gets fluent Greek from the same knowledge base, not a translation layer bolted on the side. It asks qualifying questions back, and it quotes the real numbers: a donation starts at one euro, membership at five a month.
What changed
The result
It is in production and in use: three hundred and eighty eight messages answered through the live embed, the most recent of them today.
Every answer routes back into their site or to their inbox rather than ending in the chat window. The agent is a way through the organisation, not a replacement for it.
The part worth keeping is the part it will not do. Told to produce a number it does not hold, it declines. That is the only behaviour that makes the numbers it does give worth reading, and it is the whole reason a system like this belongs in front of a non-profit's donors at all.
The stack
Where it runs
- Liberators OS
- os.liberators.ai
- GPT-5.1
Embed
- embed.js v2.5.0
- shadow DOM
- token auth
- origin-gated settings
Knowledge
- 2 indexed documents
- workspace briefing
- Greek + English
Switched off
- agentic mode
- voice
- file and image generation
- sandbox