CARLOS

Take your software home.

Why your organisation would run on CARLOS, and what you get when you do.

For adopters · draft 1 · September 2026 · carlosframework.com

where you are

You rent your software, and it shows.

Per seat, per month, forever. Your data in someone else's tables. Their outage, their roadmap, their price rise.

You cannot read itYou cannot leave with itYou cannot say no

Bullshit.

the answer

An instance your organisation owns.

One app binary and one database file, with updates and operation still managed.

Your dataYour hostYour right to leave

what you get

A suite you can own.

Each app is one instance per team, open, and yours to run wherever you like.

Eleven

Team chat. Replaces Slack, Teams.

Keymail

Email and sign-on. Replaces Gmail, Outlook, Okta.

Oficina

Docs, sheets, calendar, files. Replaces Google Workspace, Microsoft 365.

amadan

Code hosting and CI. Replaces GitHub, GitLab.

Woodstar

Social. Replaces the feed you do not control.

Correomona

Mailing lists. Replaces Mailchimp. shipping this week

secure

Publish the database and see what leaks.

That is the test every CARLOS app is held to. For most of the suite, the answer is nothing.

One team, one process, one fileEnd-to-end encrypted where it mattersAnything readable is named and tested

fast

Fast because there is almost nothing there.

One binary, one file next to it, server-rendered pages. No client framework to download before you see a word.

No network hop to the databaseAbout 130 lines of JavaScriptWakes from parked in well under a second

cost

Sleeping is the default state.

A parked app runs no process. Its data waits in storage until the next request wakes it.

$5per app per month, Carloku rate sheet 60¢compute per month at two awake hours a day ¢cents of storage
awake
parked

where it runs

Cloud, on-prem, hybrid. Same app.

Hosting is a choice made outside the instance's boundary.

Hosted

Your hardware, CARLOS routing

Fully self-hosted

residency

Data stays where the law wants it.

Residency is enforced where the instance wakes, not promised in a policy PDF.

Storage per region, never sharedA wrong-region wake failsErasing a tenant is deleting a file
Ireland
United Kingdom
Sweden

control

You choose when to update. You can run your own fork.

Pin a version, pick the moment you move, or ship your remix to your own channel and keep everything else.

your instance
v3.2 · nowv3.3 · when you sayyour fork

people and agents

Every action is a page for a person and a tool for an agent.

The same handler serves both. An agent cannot take a shortcut a person could not, and writes need a sentence a human would approve.

Use it with AI, or withoutBring your own model, or noneRun the whole platform from the command line

building on it

Prototype in production.

One command from a branch gives you a canary behind your real sign-on, in seconds. Idle canaries sleep, so ten experiments cost almost nothing.

The dev pipeline is the prod pipelinePromotion is gated, rollback is a pointerProduct people click the real thing

evidence

Tito already runs this way.

Its own cloud account, hosts, storage and domains, on the published deployment modules.

Ireland, UK and SwedenSeapointish replaced a hosted finance toolRestore rehearsal: 17 databases in 16 seconds

Every app is a starting point for the next one.

how to start

Start with one app. Keep everything else.

TodaySign in to Carloku and ship an appOr put the CARLOS edge in front of what you already run
NextMove one team's data homeLet the idle parts sleep
ThenReplace a rented tool with one you ownSelf-host with the published modules when you want to

what is still young

Fewer claims, all of them checkable.

CARLOS

Take your software home.

carlosframework.com · console.carloku.com

Open sourceSelf-hostableYours to leave with

appendix

The long tail.

Mechanisms, numbers and status behind the slides before this one. Every unfinished thing is labelled.

Appendix · architecture · two shapes

Two shapes. One binary each.

the framework · rastrillo

The shape of an app

A Go program that compiles to one static binary and talks to one SQLite file. Five source files, a templates folder, server-rendered HTML, about 130 lines of JavaScript in total. Every app looks the same, so every app can be read, forked, and driven.

app = 1 binary + 1 database file + 1 hostname

the platform · carlos

The shape of a deployment

An object-store bucket holds all durable state. Hosts run the carlos binary and converge on what the bucket says. A shared edge routes traffic. Idle instances park into the bucket and wake on the next request.

deployment = 1 bucket + N hosts + DNS

The framework is the shape of a CARLOS app the way the platform is the shape of the substrate it runs on. Apps that fit the shape get hibernation, residency, rollback, and an agent interface for free.

Appendix · distribution · channels and versions

Many versions in production at once, and the user picks.

  • A release is a hash, a channel is a pointer. Shipping uploads an immutable release under its content hash. Stable, beta, and any number of named or throwaway channels each point at one. Advancing a channel is a single write; rollback is the same write backwards.
  • Instances subscribe, they are not pushed. Each instance follows a channel and rolls onto a new release at its next natural boundary: waking from hibernation, or a drain-and-restart sweep. Nothing is interrupted mid-request.
  • So an author runs several versions side by side, for real users. Beta for the keen, stable for the careful, a long-lived channel for a customer who needs last quarter's behaviour. Same binary family, same edge, different pointers.
  • And a user chooses when to move. Eleven already lets its users pin a version or pick the moment they update Eleven today, platform-wide next. The app store's "update now or later" prompt, for server-side software, which no SaaS has ever offered.

The tiny thing with big consequences

A customer who wants their own remix of a deployed app forks it, ships to their own channel, and points their instances at it. They keep the upstream sign-on, the edge, the hibernation and the trust tier. Upstream keeps shipping. The two never have to merge unless they want to.

That is an app store for organisations: one catalogue of apps, many channels per app, every instance deciding which one it follows. The pipeline that gates a promotion, with bake windows, passkey step-up and approvals, is what makes a channel safe to trust.

Appendix · development cycle

Prototype in production. Ship a canary in seconds.

The dev pipeline is the prod pipeline

There is no staging system to keep in sync. A dev environment is a channel with one subscriber. One command from a branch builds, ships, makes a channel, spawns an instance and hands back a URL. Every push exercises the same path a release will take.

Canaries live behind production

A canary instance sits behind production sign-on, on a production hostname, with production data shapes. A product manager no longer prototypes in an abstract external tool and then argues about what was meant. They open the canary, use the real thing, and say yes or no.

Continuous, and cheap to be wrong

Canaries ship continuously in seconds, and a canary nobody is using hibernates like everything else, so ten open experiments cost roughly nothing. Promotion to a wider channel is gated by the pipeline: bake windows, passkey step-up, approvals. Rollback is a pointer.

The gap between "an idea" and "a thing real people can click, behind real auth" closes to the time it takes to compile. That changes who gets to try ideas, not just how fast.

Appendix · security and trust

Isolation at minimum. Encryption at maximum. Honesty in between.

The floor: one team, one process, one file

There is no team_id column in a CARLOS app because there is no second team in the database. Isolation is the operating system's boundary: an ephemeral system user per instance, its own SQLite file, its own hostname. Inside an instance, a row that is not yours answers 404, never 403. It does not exist.

The ceiling: the server cannot read it

Keymail, Eleven, Woodstar, Kass and amadan are end-to-end encrypted. Keys are made in the browser and never leave. The object store holds parked databases and blobs but no plaintext of any E2EE app. amadan proves it in CI: push a marker string, then grep the server's raw database bytes for it.

The rule: theatre is worse than an honest leak

An app that must read data says so. Correomona reads every address it holds because an address must be plaintext to go in an envelope. Its named leaks are listed in the README and pinned by a test that fails when a new plaintext column appears without a dated reason.

The test for every app is the same: publish the database and see what leaks.

What that test proves: nothing readable is stored at rest. What it does not prove: key handling, authorisation logic, or a compromise of a live host. Those are the certification arm's job, later in this deck.

Appendix · speed and durability

Fast because there is almost nothing there.

1static binary per app, no runtime, no container image
0network hops to the database. SQLite is a file next to the process
~130lines of JavaScript in the whole framework
<500 mscold wake for most apps, from parked in a bucket to answering
  • Server-rendered HTML. The page is the response. No client framework to download, hydrate and reconcile before a user sees a word.
  • Reads never leave the machine. A reader pool sized to the CPU on a local file. The heaviest thing between a request and its answer is the kernel.
  • A stripped app binary is 15 MB, 5 MB compressed. Shipping a release is uploading a file. Rollback is moving a pointer.
  • Lightweight enough to wake on demand. A running tenant is 20 to 60 MB of memory. A parked one is unarchived from the bucket and answering on whichever eligible host claims it first, usually in under half a second.
  • Durable by replication, with a window you set. Every write streams to the bucket, at an interval tunable down to one or two seconds where the app needs it. While replication is healthy, a crash loses at most that window; a restore is copying a file back. Tito has rehearsed it: seventeen databases in sixteen seconds.

The wake figure is anecdotal across the family's apps; request percentiles are not yet benchmarked.

Appendix · deployment modes

Cloud, on-prem, hybrid. Same app, same edge, same CLI.

cloud hosted

Sign in, ship, live.

A member of an account brings an app live with a login alone. The console writes the manifest, pins the hostname, and the boxes converge in seconds.

hybrid · your hardware, our edge

Customer fleets and off-cloud hosts.

A CARLOS host is anything that can reach the bucket. A remote host is outbound-only: port 443 out to storage and the edge tunnel, no inbound port, no SSH required. Your data bucket, your box, our routing.

fully self-hosted

One bucket, some boxes, DNS.

The same OpenTofu modules the flagship uses are published for anyone. Two of the platform's first three deployments are self-hosted, so anything the flagship needs that a self-hoster cannot have is a design error, caught immediately.

No UX compromise because there is no second product: same hostname, same pages, same sign-on, only the bucket's address changed. Residency is enforced where the instance wakes, not promised in a policy PDF. And leaving is the design: point new boxes at your bucket and the platform is elsewhere; point them at another cloud's bucket and so are you. Who runs the bucket, the edge, sign-on and backups is a named choice in each mode, not a hidden dependency.

Appendix · any host

Two boxes and an internet connection is a highly available platform.

Platform agnostic

A CARLOS host is anything that can reach the bucket: a cloud instance, a rack in a cupboard, a laptop, a board on a shelf. The platform depends on an S3-compatible object store and DNS, and that store can be a cloud's or one you run yourself. Everything else is optional; how many cloud services you use is a decision per deployment, not a requirement of the software.

Two boxes, one bucket

Two hosts watching the same bucket survive the loss of either: the survivor claims the lease and wakes the instance from parked state, with no cluster software or quorum to run. What it still depends on is the bucket, DNS and the edge being reachable. And the caveat is physical: whoever can touch the box can read what is awake on it, so the trust tier and the room both matter.

Pooled compute, in theory not yet built

Because a host is outbound-only and disposable, contributed machines can join a fleet from anywhere: a community's members, a university's departments, a co-op's offices, meshed through the edge tunnel. The bucket stays the source of truth; the compute is whatever people bring.

Cloud when you want it

Nothing stops a deployment from using what the clouds do well. Latency-based routing sends a user to the nearest armed edge. Per-region buckets keep data where the law wants it. Same binary, same app, with or without the extras.

The floor is very low and the ceiling is very high, and it is the same software at both ends. Instances move between regions with their data following, two-phase, over a push-only staging prefix specced, in progress. The box is disposable, the bucket is not.

Appendix · driveable by humans and agents

Every action is a page for a person and a tool for an agent.

  • Same handler, both doors. An action opts in as a tool with a description and typed arguments. A tool call and an HTTP POST reach the identical function, through the same session and CSRF middleware. An agent cannot take a shortcut a person could not.
  • Writes need a sentence. A write tool renders a confirmation sentence with the call's actual arguments. The agent must say what it is about to do, in words a human would approve.
  • Skills are published, not prompted. Apps publish agent skills at a well-known URL, digest-verified. The framework's own authoring contract is one file with an enforced 18,000-byte budget: its value is its smallness.
  • The CLI is the ops agent surface. Every carlos command is designed for a user with no access to the underlying infrastructure. If a task needs a box, that is a product gap.

What is deliberately absent

No bundled LLM client. Choosing a provider is your business. No MCP server in the platform. The agent interface is the app's own actions, exposed as typed tools, so it works with whichever model or none. A person using CARLOS without AI loses nothing. A person using it with AI gets an operator that can only do what the UI already allows.

Appendix · scale · a hypothesis

Deploy once. Sleep by default. Scale by declaration.

ParkedA few objects in a bucket. No process, no memory, no host doing anything.
Embedded SQLiteWoken on request, one process, one file. Where almost every app lives almost all the time.
ReplicatedStreamed to the bucket continuously, at an interval as short as one or two seconds; a crash loses at most that.
Attached databaseA server database, one per instance, inside the app's trust domain, never multi-tenant.
Dedicated poolReserved hosts and optionally a private bucket for apps holding real personal or payment data.

An app moves along that curve by changing its manifest, not its architecture. Because the unit is an instance, growth is horizontal by construction: many users means many small databases waking when needed, not one database that must never fall over. Dineraya is built on exactly this: one instance per buyer, asleep in a bucket, so the network can fill in behind real purchases instead of needing a user base first.

This is a scaling hypothesis, not a load test. The largest fleet today is hundreds of instances. The next test is thousands, then the routing, storage-operation and fleet-administration limits at each step. Hibernation default is 15 minutes idle, tightening to 90 seconds.

Appendix · economics detail

The platform counts pennies because its customers can.

$5per app per month on Carloku, the first hosted provider, with a free tier of one app
per awake instance-hour on Carloku. An app used two hours a day is about 60¢ a month of compute
0compute at rest, on any provider. A parked instance is a few objects, billed at storage prices only
  • A full month for a typical team app on Carloku: the $5 app fee, about 60¢ of awake compute at two hours a day, and cents of storage. Under $6, with the assumptions stated. The equivalent seat-priced SaaS for a ten-person team is commonly $50 to $150.
  • A bug that cost $7.30 was treated as an incident. A five-minute scheduled tick answering in one millisecond was keeping an instance awake all month: fifteen minutes of residency bought for a millisecond of work. Fixed in about a hundred lines so scheduled work wakes an instance without holding it.
  • A heartbeat was rewritten to save about $15 a year per instance. The lease heartbeat was 8,640 storage writes a day, around $16 a year and most of the fleet's storage bill. Now 288 a day, around $0.50. When an app can cost less than a coffee, the platform has to care at that scale.
  • Cross-region traffic appears in nobody's bill. Backhaul between regions is absorbed by the platform so residency is never a surcharge.
  • Carloku is one provider, not the price. The platform is open; anyone can host it. A self-hoster's cost is their own hardware and storage, and nothing else. There is no licence fee to own.

Appendix · migrating existing apps

You do not have to rewrite to start owning.

1 · Put the edge in front

A conventional Rails or Django app runs behind the CARLOS edge unchanged, keeping its own sign-on wall. Tito's proof of concept did exactly this. You get the routing, certificates and fleet view first.

2 · Move the data home

Give the app its own instance record, a per-region bucket, and a pool. Residency and restore rehearsals come with it: Tito restored seventeen databases in sixteen seconds from the bucket.

3 · Let the idle parts sleep

The admin screens, the reporting, the once-a-week job: split them into CARLOS instances that hibernate, and stop paying for them at 3am.

4 · Rebuild the hot path

When a feature is worth owning outright, write it as a CARLOS app beside the old one. Same hostname family, same sign-on, faster, and it is yours.

Each step is reversible and each step pays for itself. The order is a real sequence, which is why it is numbered.

Appendix · the app catalogue, with status

Teams are already using CARLOS to replace corporate tech.

appwhat it isreplacestrust posture
ElevenTeam chat. One instance per space. The code quarry the platform came from.Slack, TeamsEnd-to-end encrypted
KeymailEmail where keys live in the browser, one database file per inbox, and strangers pay proof-of-work for first contact. Also the family's sign-on.Gmail, Outlook, OktaEnd-to-end encrypted
Ocho in developmentPersonal messaging, forked from Eleven. Lives at ocho.chat.Signal, iMessage, WhatsAppEnd-to-end encrypted
OficinaOffice suite: docs, sheets, calendar, memory, files via Slopbox, single sign-on via Keymail. One instance per team.Google Workspace, Microsoft 365Sealed per team
WoodstarSocial relays where follow lists are private and keys travel with the user.X, Facebook, Mastodon serversEnd-to-end encrypted
amadanGit hosting and CI where the server cannot read your code. Hosts and gates the platform itself.GitHub, GitLab, ActionsEnd-to-end encrypted, canary-tested
Correomona shipping this weekMailing lists with consent recorded per list and checked at send time. No open pixels, no click rewriting, no engagement scores. One instance per team.Mailchimp, BrevoServer-side, named leaks tested
Dineraya proof of conceptNon-custodial payments over instant bank rails. One instance per buyer, one per merchant, a blind dispatcher. Nobody in the middle holds money.Stripe, PayPal, card feesSealed to the buyer's passkey
Kass · SeapointishCoaching, one instance per person. A team ledger across Revolut, Wise and Stripe.Niche SaaSE2EE · sealed single-tenant

Appendix · compliance · evidence and remaining work

GDPR and ISO/SOC get quicker when the scope gets smaller. Not free.

GDPR: the hard parts are structural

  • Residency is enforced at the IAM layer: a wrong-region wake fails, it does not warn.
  • Erasure and portability at tenant level are one operation: a tenant is one file. Replicated copies, blobs and logs follow the platform's retention window, which the record has to state. Per-person deletion inside an instance is the app's job, and not every app has built it yet.
  • Data minimisation is the default shape: no shared tables, no cross-team query, no server-side social graph.
  • Consent is recorded with the wording on screen and checked at the moment of sending.
  • Processor exposure shrinks to blind services, which by doctrine may hold only what they cannot read doctrine; services in progress.

ISO 27001 and SOC 2: an audit surface you can read

  • One binary, one bucket. The whole system is inventoried in a sentence. There is no control plane to harden and none to be locked out of.
  • Change control is signed. A bucket write alone is not a deployment. Channel pointers are signed, stable adopts after a 72-hour bake, rollback is a pointer move and never bakes.
  • The bucket is the audit trail, and apps can publish hash-chained ledgers that anyone can verify over plain HTTPS with no credentials at all.
  • Access is two roles and a typed device code, chosen because the clickable link is the phishing attack.
  • Claims are tests. "The server cannot read it" is a CI job, not a paragraph.

No CARLOS deployment is certified yet, and no control mapping to ISO 27001 or SOC 2 has been written. The claim is narrower: the system already produces much of the evidence about data handling, in a form an assessor can re-run. The remaining work is a control mapping, a subject-access export, per-app deletion, a privacy policy and terms, and an assessor.

Appendix · features shipped and in progress

What a deployment gives you on day one, and what is coming.

shipped today

Ship
Immutable content-addressed releases, promotion ladder that never rebuilds, one-command deploy that waits for the live version, rollback as a pointer move, shapeable pipelines with bake windows and approvals, one-command canaries per branch, release retention, signed channel pointers, static sites on the same channels.
Run
Instances, hibernation and wake-on-request, scheduled jobs by cron or interval that wake sleeping instances, restarts, latency-steered DNS, residency, dedicated pools, per-app capabilities consented per box.
Configure
Environment bundles, secrets sealed client-side, feature flags the platform serves but never interprets, accounts as the tenancy primitive, machine credentials with fixed reach, device-code login.
Network
A platform hostname per app, custom domains with automatic certificates, wildcard and catch-all, route inspection, an edge that does TLS and hostname proxying.
Observe
Log tailing with follow and regex filter, live fleet status, host and process metrics with alerting and a dashboard, customer fleets of remote boxes, a monthly economics record.
Data
Object storage per app, outbound mail identities, append-only hash-chained ledgers with public verification, continuous replication with restore and hibernation verification, self-update with signed checksums.

working on

Safety
Virus and malware scanning of uploads.
Media
Media hosting: images, video, resizing and transcoding as a blind service.
Errors
Error monitoring and crash reporting at the app level, beyond host alerting.
Analytics
Privacy-respecting product analytics, in the family's style: no pixels, no fingerprints.
Blind services
Vault, push relay, OAuth relay, URL unfurler, PDF renderer: stateless by construction, allowed to see but never to store.
Platform
Instance moves between regions, managed custom domains, member-facing backup and restore, app webhooks, search.

Every item on the left is a CLI command and an API call, designed for someone with no access to the boxes underneath. That is what makes the platform fully driveable by an agent as well as a person: if a task needs a human on a box, it is filed as a bug.

why CARLOSappendix
← → navigate · N notes · P print