Our team

Join our team and help us transform urban mobility

Engineering

After the Prompt: How Anyone at Cabify Became a Builder

Oct 07, 2026

AI made it easy for anyone at Cabify to build a small tool or prototype, but sharing it safely was still hard. This is the story of cabify builders, a private publishing platform with almost nothing to run: why we built it, how it works and what our colleagues made with it.

A new wave of builders with nowhere to publish

At Cabify, a builder is anyone who solves business problems by creating software. Engineers always were. Over the last year, AI widened the circle to people who had never written code. Designers, operations colleagues, marketing and business teams describe what they want, iterate with an assistant, and end up with something that runs in a browser. One colleague turned a spreadsheet into a searchable register of eligible vehicles without writing the code themselves. None of it went through a ticket with engineering, and nearly all of it ended with the same artefact: a folder containing index.html.

Then they got stuck at the same point. A folder on a laptop cannot be shared, so screenshots went into chat, zip files were attached to messages, and things that should have been a link became a screen share. With nowhere to publish, work drifts to outside hosting, where nobody signs in, nothing is audited and nothing is removed when someone leaves. Nobody knows what company data is out there, and banning it only hides it better.

Diagram of the gap: three colleagues build with AI and end with a folder, then hit a missing step that leads either to screenshots and zip files or to hosting outside the company perimeter. Everything up to the folder worked. The step after it was missing.

Cabify already had a publishing path for websites through code repositories. For Product, Marketing and anyone without a technical background, it was a wall of friction that kept them from experimenting at all.

Distribution is the new bottleneck

AI solved “how do I build this” for people who never wrote software. It did nothing for “how do you see it”, and nothing for sharing the result securely and easily. The constraint on internal software moved from authorship to distribution, and most platform tooling, ours included, is optimised for authorship.

Three signals told us that a better repository workflow would not fix this. The work always looked the same: a static folder. The makers were mostly not engineers. And each thing needed a small audience: the most-viewed sites reach 20 to 100 people, and most reach far fewer. That is too small for a team, a repository and a service owner, and too useful to ignore.

So we left the first publishing path alone and built a second one. Cabify keeps a path for technical profiles, with more power: a repository, a merge request, a pipeline and a custom domain. On a product site owned by an engineering team, each of those steps is worth its cost. cabify builders is the second path, private by default and behind the same single sign-on (SSO).

Between the folder and the URL, the second path has no build step, no manifest, no review, no pipeline, no domain, no secrets and no cloud account. It keeps three things from the first path: SSO in front of every page, versioned storage underneath, and an audit trail of who published what.

Two publishing paths behind one single sign-on wall: product sites through repository, merge request, pipeline and domain; cabify builders through one step, from folder to private URL. Two paths, one login. The repository path keeps its rigour; cabify builders keeps SSO and little else.

What cabify builders does

cabify builders is an internal publishing platform where any employee drags a folder onto a web page and gets a private URL behind SSO within a minute. Each site lives under the employee’s own path, /<your.name>/<site>/.

The cabify builders console: a drop zone for a folder, an archive or a single HTML file, and a list of the user's sites with copy link, QR code, download, restrict and delete actions. The whole publishing interface. Shown with a demo account and example sites.

Anyone can start publishing straight away, with no sign-up: the platform provisions a namespace from HR data for every active employee, often before they have heard of it. About 150 people have already published, and many more open the sites others share.

Everything is private by default and there is no public option. Anonymous visitors see a login redirect, and any employee can open any site unless its audience has been narrowed.

Mistakes are cheap. Every file version is kept for 90 days, and overwrite and delete are reversible by the user without involving us. Drafts need no machinery: publish to my-thing-draft and you have an authenticated preview.

There are four equivalent ways to publish: the web console, an AI agent skill, a shell script and the cloud storage CLI. The skill is one self-contained Markdown file that teaches an AI coding agent the whole workflow. All four publish with the employee’s own identity.

Four ways to publish (console, AI agent skill, shell script and cloud CLI) converging on the employee's own identity, one versioned bucket and one private URL. Four ways to publish, one identity, one URL. Pick the one that matches how you work; the result is the same.

The platform adds one small script to every HTML page it serves. That gives the platform a hook on every site without touching anyone’s files. Today it powers real-user metrics and a small “Published on cabify builders” badge that links back to the console, and it can carry a banner or a notice whenever the platform needs to speak to viewers.

The limits come from what the second path leaves out: no public sites, no custom domains, no server-side code, no per-site headers or cache tuning. Sites live under a path prefix, so root-absolute asset references 404. The console, the script and the skill lint for this and warn.

Built on boring technology

We followed Dan McKinley’s advice to choose boring technology. Every piece is an open-source project that runs at far larger scale elsewhere, doing the job it was built for. An NGINX ingress controller terminates the host. oauth2-proxy authenticates every request against Keycloak, our SSO provider. Behind it, a read-only nginx-s3-gateway serves files from one Google Cloud Storage bucket through its S3-compatible API. The bucket has versioning on and one folder per employee. There are no per-user proxies, clients or secrets, so nothing in the diagram below multiplies when the next hundred people join, and the bill grows with storage and traffic, not with headcount.

Architecture: an NGINX ingress controller and oauth2-proxy with Keycloak in front of a read-only nginx-s3-gateway, one versioned bucket and one reconciler fed by HR data. One proxy, one gateway, one bucket and one reconciler, for everyone.

Boring technology is half of the story. The other half is how we try to work: build reusable building blocks first, design them to fit together, and assemble the next thing from them. Cabify builders reuses the identity service the Security team runs for the whole company, which already exposed the roles we needed, the shared ingress fleet that already serves our other static sites, and the same GitOps pipeline as every other Kubernetes deployment. What we wrote ourselves is small: a console, a reconciler, a few scripts and some configuration. We stand on the shoulders of giants.

The part we would most recommend copying is how we split identity. SSO decides who you are and which pages you can see. It never writes anything. Publishing takes a different route: the browser uploads straight to object storage with the employee’s own Google account. There is no upload service in the middle, so there is no privileged account that could write into someone else’s folder. Each person can write to their own folder and nowhere else, and the storage audit log names whoever made each change.

Identity split: the SSO session only reads; the browser writes to the employee's own folder with their own Google identity; no upload service exists. SSO only reads. Each person writes to their own folder with their own account.

By default every employee can open a site, and people outside the company who hold a company account can be added after review. Some sites need a narrower audience, such as a leadership dashboard or one department’s tool. Narrowing takes two reviewed merge requests and no new infrastructure: a role and access rule in the identity source of truth, and an Ingress manifest that records owner, audience and reason. Access policy at Cabify gets human review, and a console that wrote policy directly would bypass it.

Restricting a site: one role and rule in the identity source of truth, one Ingress manifest as the access record, roles take effect in about 30 minutes. Two reviewed changes and no new infrastructure: the role and the Ingress manifest are the whole access record.

Why nothing grows per user

When someone joins Cabify, they show up in the HR data, and a job that runs every day, the reconciler, creates their folder and lets their Google account write to it. Nobody has to ask for anything. When someone leaves, the next run takes that write access away, and they stop seeing sites once their SSO account is deactivated. Their content is not deleted at this point, but it will expire automatically after 90 days. Each run also puts back any permission that was changed by hand. Sometimes a new joiner’s Google account is created after their HR record. We call these people ghosts: they get their folder straight away and write access once the account exists.

The reconciler has a safety threshold. It aborts if more than 5% of folders would lose their owner, or if more than 5% of people have no Google account. A broken HR feed cannot mass-revoke.

Reconciler loop: read HR data, create folders and IAM for joiners, revoke leavers, report orphans, and abort if a broken feed would change too much. The reconciler is the only thing that touches per-user state, and it refuses to act on a broken feed.

The console itself is platform content: a static app in a reserved folder of the same bucket, served by the same proxy and gateway, so deploying it is a copy. The whole stack is declared in Git and reconciled automatically, like the rest of our Kubernetes deployments. The operational surface is two proxy replicas, two gateway replicas, one scheduled job and one bucket.

Observability

Two Grafana dashboards watch the platform. The first shows platform health: golden signals for the shared stack, from proxy and ingress metrics, service-mesh metrics for the gateway, and logs. When someone reports being denied on a site, it tells us within seconds whether that is one person or everyone. The second shows adoption: page views, distinct viewers and engagement time. We measured the usage numbers of each site with Grafana Faro, which runs inside the injected script, plus the console’s own events. Faro also backs our web performance work, and its events land in the same Grafana Alloy stack as our mobile observability.

Observability: the beacon in every served page feeds the adoption dashboard through a collector, logs and recorded series, while proxy, gateway and ingress metrics feed the platform health dashboard. Two flows, two dashboards: what the pages report, and what the stack reports about itself.

How it is changing the company

A new group of people, most of them outside engineering, now ship small working tools and prototypes to their colleagues as links rather than screenshots. The numbers come from the adoption dashboard and are rounded.

cabify builders in numbers  
People who published (each counted once) about 150
Sites viewed about 600
People who viewed a site (each counted once) about 560
Site views about 10,000

What people built surprised us. There are prototypes, but the most-viewed sites are operational tools nobody asked engineering for, such as a business transformation knowledge hub accessed by close to 100 people, city operations cockpits, or the spreadsheet-based register of eligible vehicles from the opening. For every person who published a site, nearly 4 colleagues accessed it. Once the beta testers’ first burst had settled, weekly successful publishes more than quadrupled in five weeks, to nearly 300 a week.

The Design team, whose critique culture and move to image AI we have written about before, built the clearest example on their own. A Figma plugin they wrote exports a design, an MCP server (Model Context Protocol, the standard way agents connect to tools) connects Figma to their AI coding agent, and cabify builders publishes the result. Going from Figma to a clickable prototype now takes hours instead of weeks, and by their own count they published around 20 prototypes in six weeks.

Adoption spread through the product itself. Every page carries a small “Published on cabify builders” badge, and that alone brought more than 80 colleagues to the console with no campaign. More than 30 people downloaded the publishing skill or script in a month. One of them, with no technical background, had a shareable link within minutes.

Adoption loop: a colleague views a site, clicks the Published on cabify builders badge, lands on the console, publishes, and is viewed in turn. The front door is inside every page the platform serves.

Privacy turned out to matter as much as convenience. SSO started as a security requirement, but it is also why people publish half-finished work: the audience is bounded to colleagues. The fear that stops early sharing is rarely “my hosting might go down”. It is “what if the wrong person sees this”.

What still hurts

About 1 in 6 publish attempts have failed, and two failure classes account for almost all of them. Of the failures, roughly 60% were partial uploads of very large folders in a browser tab. Roughly 40% came from one unticked checkbox on Google’s consent screen, which shows storage access as a granular permission the user can skip. Every publish afterwards fails with an error that explains nothing. In the most recent month the checkbox overtook partial uploads. We warn in the console and in the docs, and it is still with us.

Bar chart of failed publishes by class, for the whole period and for the most recent month: partial uploads and the unticked consent checkbox account for nearly all failures, and the checkbox leads in the recent month. Most failures are a browser tab giving up or a checkbox nobody ticked.

What comes next

A static site is a front end without a back end, and people now want pages that read and act on company data. Mythril is Cabify’s API gateway for the builders ecosystem. Sites on cabify builders can already call it with the visitor’s own short-lived token, sent as a Bearer token, and never with the owner’s identity. The page asks the SSO proxy for that token on each request and passes it to the gateway, which decides what the visitor may call. How the gateway works deserves a post of its own, so keep an eye on our tech blog!

Diagram: the page fetches the visitor's short-lived token from the SSO proxy and sends it as a Bearer token to the Mythril gateway. The visitor’s own token, fetched per request, never written into the page.

What we would tell another platform team

  • The bottleneck moved past your platform. Authorship is solved; distribution is not.
  • Your most important users may not be engineers. A zero-tax path can be a different path, not a softened version of the strict one.
  • Build on what your platform already runs. Most of this was assembled from blocks other teams had built to be reused.
  • Private by default is an adoption feature. Safety allowed velocity.
  • Publish your limits and your failures. The limits are deliberate, and the failure classes are in the console, the docs and this post.

Acknowledgements

This tooling exists because of people across the company. The platform team designed and built it. The Design team tested it in beta and turned it into a workflow of their own. The Security team built the identity service that made SSO and per-site roles something the platform could consume rather than build. Everyone who published a site and told a colleague did the rest.

Adrián Callejas

Senior Infrastructure Engineer

Choose which cookies
you allow us to use

Cookies are small text files stored in your browser. They help us provide a better experience for you.

For example, they help us understand how you navigate our site and interact with it. But disabling essential cookies might affect how it works.

In each section below, we explain what each type of cookie does so you can decide what stays and what goes. Click through to learn more and adjust your preferences.

When you click “Save preferences”, your cookie selection will be stored. If you don’t choose anything, clicking this button will count as rejecting all cookies except the essential ones. Click here for more info.

Save preferences