Skip to content
ettc

Engineering

This is not a dashboard bolted onto an export.

What we deliver is software: versioned, tested, shipped through a CI pipeline, monitored in production and documented so it can be taken over without us. This page is written for whoever wants to check - a CIO, a technical supplier, a buyer with a checklist.

The principle

Most data projects in a small business stop at a dashboard wired to an export. It holds for three months: until a file changes a column, until the person who maintained it leaves, or until someone asks for a figure nobody planned for. That is not a system, it is a snapshot.

What we put in place is a system: connectors that know how to resume after a failure, a warehouse that keeps history, a data model that names your business objects, a quality layer that rejects doubtful data, and an AI layer that computes nothing itself. Every piece is code, in a repository that belongs to you.

The difference shows after six months. A dashboard wired to an export gets rebuilt. A foundation gets extended: the next need costs days, not weeks.

The architecture, layer by layer

Six layers. For each one: what it does for your business, what is inside it, and the guarantee it carries.

Architecture diagram: sources are ingested idempotently, consolidated into a historised PostgreSQL foundation, then queried through two paths - a deterministic path and a model layer.

Sources

  • Business APIs
  • Files
  • Webhooks
  • Inboxes

Idempotent ETL

Scheduled, replayable, logged

Historised PostgreSQL

Data model, materialised views, versioned migrations

Two answer paths

  • Deterministic path

    Validated business calculation, semantic cache. Handles most requests.

  • Model layer

    RAG on pgvector, structured outputs, guardrails. Called when it earns its place.

  1. Ingestion

    What it does
    Fetch the data where it lives, without anyone exporting a file.
    What is inside
    Python, Go, asynchronous processing, Pub/Sub, Cloud Tasks, RabbitMQ, scheduling and replay
    The guarantee
    Every run is idempotent: replaying it creates no duplicates. A source unavailable overnight is caught up on the next cycle, and every run leaves a timestamped trace.
  2. Warehouse and modelling

    What it does
    Keep the history and name your business objects once and for all: customer, order, assignment, contract, hour worked.
    What is inside
    PostgreSQL, BigQuery where volume warrants it, materialised views, reviewed indexes and query plans, versioned migrations
    The guarantee
    The state six weeks ago still exists. Migrations are versioned and replayable: no schema change is made by hand in production.
  3. Quality

    What it does
    Reject doubtful data rather than display it with confidence.
    What is inside
    Freshness, volume, uniqueness and referential consistency checks, run on every cycle
    The guarantee
    A failing check blocks publication and raises an alert, instead of letting a wrong figure travel all the way to your screen. Anything that stays uncertain is flagged rather than guessed.
  4. Semantics and AI

    What it does
    Understand a question asked in plain language and tie it to a defined, validated business calculation.
    What is inside
    RAG, pgvector, embeddings, hybrid search, reranking, function calling, structured outputs, guardrails and fallback
    The guarantee
    The model does no arithmetic on your data. It picks a query defined in advance, runs it, and the answer shows what ran and how long it took. Outside its scope, it stops and says so.
  5. Delivery

    What it does
    Make all of it usable: screens, reports, alerts, and access from your own tools.
    What is inside
    React and Next.js, React Native, REST and gRPC APIs, exports, alerts, MCP servers
    The guarantee
    Every figure on screen is tied to its source and to its last sync time. What you see, you can trace back to the originating row.
  6. Operations

    What it does
    Keep all of it running without it becoming your problem.
    What is inside
    GCP Cloud Run, Docker, Kubernetes, CI/CD, observability, logging, cost tracked per request, semantic cache
    The guarantee
    Nothing reaches production without going through the pipeline. Incidents are caught by monitoring before your teams report them.

Security

What we apply by default, and what is not a paid option.

01

Least privilege

Every connector uses a dedicated service account, read-only where reading is enough, limited to the tables it needs. No connector runs with an administrator account, and none runs under the personal account of one of your employees.

02

Secrets

Credentials and keys never live in the code or in a versioned configuration file. They are held in a secret manager, injected at start-up, and revocable without a redeployment.

03

Encryption

Encryption in transit on every exchange, encryption at rest on the warehouse and on the backups. A backup is protected as seriously as the database it came from.

04

Isolation

One client, one perimeter. One company's data does not travel through another's infrastructure, and isolation is enforced at the database level, not only in the application.

05

Access logging

Who read what, and when. Data access and executed queries are logged: that is what lets you answer an audit, and what tells you what happened on the day something looks wrong.

06

Authentication

Named accounts, never a shared one. Hooked into your directory or identity provider where you have one, with a second factor.

GDPR and compliance

You remain the controller, we are the processor. Here is what that means in practice.

Processing agreement

A DPA under Article 28 GDPR frames the engagement: purposes, duration, sub-processors, security measures, what happens to the data when the contract ends. It is signed before the first access to your data, not after.

Hosting

Hosted in the European Union. Any component that would sit outside it is identified and discussed with you before it is used, not discovered along the way.

Minimisation

We only retrieve the data needed for the uses defined during the audit. Sensitive fields that serve none of those uses are dropped at ingestion rather than stored just in case.

Retention

Each category of data has a retention period, written with you and enforced by an automatic purge. Keeping history is not an excuse to keep everything forever.

Data subject rights

An erasure or rectification request propagates all the way to the warehouse and to the search indexes, not just to the originating tool. That is exactly where most architectures fail, and it can be verified.

EU AI Act

The systems we deliver fall under the transparency obligations of Article 50: the person knows they are talking to a machine, and they can see what that machine ran. We build neither scoring of people nor fully automated individual decisions.

Records and documentation

The processing is documented so it can go into your record of processing activities: nature, purpose, categories of data, recipients, retention. You are handed what you need to complete it rather than having to reconstruct it.

Reliability and operations

What separates a demo that works from a system you can lean on.

01

Continuous integration

Automated tests and deployment through a pipeline. Nobody copies a file onto a server, and every version in production maps to an identifiable state of the repository.

02

Separate environments

A working environment and a production one. A migration is run elsewhere before it touches your data, never straight onto it.

03

Monitoring

Ingestion cycles, response times and errors are watched continuously. A sync that fails two nights running raises an alert: it does not go unnoticed until the day a figure looks odd.

04

Backups

Regular, encrypted backups, with a written restore procedure that has been exercised. A backup never restored is not a backup, it is an intention.

05

Service level

Coverage is written into the operating contract: hours, acknowledgement time, reporting channel, and what is not covered. A vague commitment protects nobody.

06

Cost under control

Infrastructure cost and inference cost are tracked per request. Deterministic routing handles most requests without ever calling a model: that is what let us divide the inference cost of our own products by fifty.

What you own

A supplier who keeps the keys is not a supplier, it is a dependency.

  • The code, in a repository that is yours. We work in it, we do not hold it.
  • Access to your infrastructure and your databases, opened in your name.
  • The documented data model: what every table, every field and every business calculation means.
  • The operating procedures: how to deploy, how to restore, how to add a source.
  • Real reversibility: another supplier must be able to take over. That is the test, and it is why documentation is part of the deliverable rather than an option.

What we do not do

Saying it at the first meeting costs less than discovering it at the third.

We are not ISO 27001 or SOC 2 certified

We apply the practices described on this page, but no auditor has certified them. If your procurement policy requires a certification, say so straight away: we will not pretend to hold one.

We do not host health data

Hosting health data in the regulatory sense requires a French HDS certification we do not hold. If your project involves it, it needs a different architecture and a certified host.

We do not score people

No candidate score, no automatic ranking of employees, no individual decision taken by a machine. It is a choice, and it is also what GDPR and the EU AI Act regulate most strictly.

We do not replace your internal IT

We build and we operate what we built. We do not take on your hardware estate, your workstations, your network or your telephony.

We do not conjure up data that does not exist

If the information is captured nowhere, no technical layer will create it. The audit says so before you commit to what comes next - that is precisely what it is for.

Do you have a CIO or a technical supplier?

Bring them in from the first meeting. Hard questions asked early cost far less than bad surprises found late.