The problem with “just ship an internal tool”
Normally, shipping a tool for your team looks like this:- Build the app.
- Figure out where to host it.
- Put auth in front of it.
- Figure out who gets access, and how they’re provisioned.
- Keep it running.
The floo flow
1. Build the app
Any web service (Node, Python, Go, Rust, static) with a Dockerfile.2. Turn on managed auth
Infloo.app.toml:
3. Restrict sign-in to your team
In the dashboard, under the app’s Users tab, add your company email domain to the allowlist (e.g.,acme.com). Only people with an @acme.com email can sign in.
4. Deploy
What your app code does
When a signed-in user hits your app, floo attaches anAuthorization: Bearer <jwt> header on every request. Verify it:
sub (user ID), email, name, and avatar_url. That’s all you need to build a per-user tool.
See managed auth for the full OAuth flow if you want server-side session handling instead.
Promoting to production
After the app is good in dev, promote it:team-directory.on.getfloo.com. The dev URL stays live for you to iterate without affecting the version your team relies on.
Who is using it
The app’s Users tab shows everyone who has signed in: email, first seen, last active, and how often. The org-level Users page rolls that up across every internal tool you’ve shipped. This is a side effect of using managed auth — you get usage data without building analytics.Managed auth reference
The full OAuth flow, JWT claims, and refresh token handling.
Custom domains
Put the internal tool on
tools.yourcompany.com instead of the default floo URL.