The Closing Window
Our AI Rollout Started With People, Not Processes image
Photo by Alex Shute on Unsplash

Our AI Rollout Started With People, Not Processes

AI Insights

TL;DR

We gave everyone at the company one AI tool: under 500 people, across several EU countries. We started with individuals' everyday work rather than top-down process automation. The tool is LibreChat, self-hosted, connected to Azure OpenAI in an EU region so data stays in the EU, with Redakt, the PII detector I wrote about earlier, in the request stream. This post covers why we sequenced it that way and what's in the setup.

Two tracks, and why we started with people

Bringing AI into an organization runs on two tracks. One is top-down: leadership and departments looking at processes and finding where AI can improve them. The other is bottom-up: helping individual people do their own day-to-day work more efficiently. You start with drafting, summarizing, translating, working through a document or a spreadsheet, then graduate to creating personal agents that optimize a very specific workflow. The stretch goal is to make everyone a builder, or at least give them the power to be.

The process track matters, but in many organizations, ours included, a lot of it depends on data that isn't yet clean or well connected, and that work takes time. The projects that need that data wait on it, while others move ahead. The individual track doesn't have that dependency, so it can deliver value sooner. What it needs is smaller: a usable tool everyone has, and some guidance on how to use it.

So we started with people. And before you can help anyone's everyday work with AI, they need access, which made the first step concrete: give everyone a single tool they can all use, good enough to be useful, running on infrastructure we control, with data kept in the EU. The rest of this post is how we built that.

What we used

We chose LibreChat. It's an open-source, ChatGPT-style front end, and it's reasonably well known in self-hosting circles, though a lot of people who work with AI haven't come across it.

For a company deployment it covers the things we needed:

  • SSO through Azure Entra ID, so access uses our existing identity setup rather than a separate user list.
  • Self-hosted, so the deployment and the data path are ours.
  • Extensible, which matters for what we want to add later.

We also looked at Open WebUI, the other common option in this space. Both are capable. LibreChat was a bit lighter to run for our needs, so that's where we went.

The stack

The model is GPT-5, running on Azure OpenAI in Sweden Central, on an EU data-zone deployment that keeps processing inside the EU for GDPR. A smaller, cheaper model handles background jobs like generating conversation titles.

GPT-5 runs about $1.25 per million input tokens and $10 per million output. Not cheap. What makes it work as a tool for everyone is usage-based billing. Per-seat AI licenses run around €20–30 per person per month, and for a few hundred people, most of whom use it lightly, that's a lot of paid-for access sitting idle. With usage-based inference we only pay for what's actually used, so the majority who barely touch it cost almost nothing. We still provide per-seat tools like Claude and Copilot for the people who live in them, but this is the base layer underneath.

PII detection with Redakt

Redakt is the PII detection service I built and wrote about previously. We connected it into our internal chat tool so it sits between the LibreChat client and the Azure inference API and inspects the conversation as it passes through. It runs asynchronously, so it doesn't add latency to the chat.

At the moment it only warns. If someone is about to send a name, an address, or other customer details, Redakt flags it. It can also be set to throw an error, and our customization then stops the conversation from completing on that basis, but we started with warnings rather than blocking.

We did that on purpose. A warning at the moment someone pastes in personal data lets people adjust their own habits first. Moving from warning to blocking later is a configuration change once people are used to the tool.

Extending it

LibreChat has two ways to add capability, and both matter for where we're taking this.

It has a built-in agents feature. It's a simplified version of the idea, a named setup combining a model, a system prompt, tools, and knowledge files that a user can select and chat with. It's limited compared to a full agent framework, but it's enough for things like a policy assistant or a drafting helper without writing code.

For anything beyond that, you build the agent in a framework like Haystack or LangGraph, expose it behind an OpenAI-compatible endpoint, and add that endpoint to LibreChat. The agent then appears in the same interface everyone already uses. LibreChat also supports MCP servers for connecting tools and data sources. The documentation covers the full range.

The first thing we're connecting is Sherpa, an AI-adoption guide I've been working on, to help colleagues figure out how to use AI in their own work.

What comes next

The process track is moving in parallel. Some of it is already underway, and the parts that depend on cleaner, better-connected data will open up as that work lands. The individual track, meanwhile, is already delivering, and it compounds: people only learn how far they can push a tool by using it. Helping colleagues with everyday tasks builds that familiarity, and my hope is that it opens up higher-level uses of AI they wouldn't have reached for otherwise, which is what the education effort and tools like Sherpa are there to support.

A shared tool and some guidance is all the individual track needs to start. The larger, process-level work runs alongside it.

Powered by Buttondown.