Rackspace Spot
ServersManaged Kubernetes on servers rented at auction from spare data-center capacity. They are older Xeon machines, cheap and good enough for everything we run.
instead of on-demand cloud VMs
A startup studio on open source
xupisco runs its products on a platform built entirely from open-source software, on one Kubernetes cluster we operate ourselves. Commit a short YAML file and a new product gets its repository, CI, database, sign-in, secrets, queues, email, CRM and preview environments.
apiVersion: platform.xupisco.com/v1alpha1kind: Projectmetadata: name: wiseresumespec: tenancy: b2c payments: provider: creem campaigns: enabled: true
Why open source
A startup usually pays a monthly fee per product for auth, email, CRM, logging, CI and queues, and those bills grow with every user and every seat. xupisco runs the open-source version of each one, once, and every product shares it.
Open-source tools charge nothing per seat, per event or per monthly active user. The cost is the servers they run on, and a new product adds almost nothing to that.
A fifth product gets the same sign-in, email, queues and CRM as the first, at no extra license cost.
With the source code available, a limit or a missing feature doesn't have to wait for a vendor's roadmap. We change the code and run our own build.
Twenty (CRM) and Plunk (campaigns) run as our own patched builds, with the AGPL source published on our Git server.
Customer records, events, logs and files live in databases we run. Nothing leaves for a third party unless it has to, such as outgoing email.
Backups go to our own object storage first, then to an off-site bucket with a 30-day write lock.
The stack, in boot order
Flux starts the cluster in eight waves. Each wave waits for the one before it, because later waves use what earlier ones install. This list matches what is deployed today.
What runs everything else.
Managed Kubernetes on servers rented at auction from spare data-center capacity. They are older Xeon machines, cheap and good enough for everything we run.
instead of on-demand cloud VMs
Applies whatever is in Git, wave by wave, and waits for each wave to be healthy before starting the next. It also bumps image tags after each build and creates one environment per open pull request.
instead of deploy scripts and clicks
How the internet reaches us.
The cluster has no public IP and no load balancer. It opens an outbound tunnel to Cloudflare, which handles DNS, TLS at the edge and access checks for admin tools.
instead of paid cloud load balancers
Routes each hostname to the right service using the Kubernetes Gateway API. It also adds single sign-on in front of tools that have none of their own.
instead of a hosted API gateway
Issues and renews every certificate inside the cluster. Nobody copies certificate files around.
instead of manual certificate renewals
Where each product keeps its state.
Each product gets its own Postgres cluster, and each preview gets its own copy. The operator handles failover, point-in-time backups and restores.
instead of managed RDS or Supabase
A Redis per product for caching, sessions and rate limits, run by an operator, with Redis Insight behind platform sign-in for inspection.
instead of hosted Redis
S3-compatible storage for uploads, attachments and backups. Any S3 client works unchanged, so apps don't know it isn't Amazon.
instead of Amazon S3
One source of truth for keys.
Every product has a secrets project with prod and dev environments. The platform writes generated keys into it, and the cluster pulls them back as environment variables.
instead of Doppler or Vault Enterprise
The few platform secrets that live in the repo are encrypted file by file, so the Git history never contains a readable key.
instead of keys pasted into CI settings
A new route publishes its own Cloudflare DNS record. It starts in wave 3 because it needs the Cloudflare token from Infisical.
instead of editing DNS by hand
Database backups, Git data and the secrets key are copied off the cluster to B2. The bucket uses Object Lock, so the key that writes backups cannot delete them.
chosen over R2, which lacks S3 Object Lock
Seeing what every request did.
Apps send OpenTelemetry to Alloy, which stores logs, traces and metrics. One trace follows a click from the browser through the API to the background worker.
instead of Datadog or New Relic
Front-end errors and page timings from real users, joined to the same traces as the backend.
instead of Sentry or LogRocket seats
Sign-in, and the engine that builds products.
One Keycloak serves everything. The team signs in once to every internal tool. Each product gets its own realm for its customers, with passkeys, a branded login page, and B2B workspaces when a product needs them.
instead of Auth0 or Clerk, priced per active user
Preview environments sign in against their own realm, so a test build can never read or change real customer accounts.
instead of test users inside production
Turns one Project file into about 75 resources across every tool on this page: realms, databases, buckets, topics, secrets, CRM, campaigns. It also drives the AWS side of email (SES, SNS, IAM). Deleting the file cleans everything up.
instead of a setup checklist
One CloudNativePG cluster for the platform's own tools, with a database each for Keycloak, Twenty, Plunk and others. Products never use it; they get their own.
instead of a managed database per tool
From commit to running code.
Our own Git server and container registry. Each product has an organization, and images are stored next to the code.
instead of GitHub seats and package storage
Pipelines live in each repo and run inside the cluster: test, build, end-to-end. Tekton Chains signs every image and records how it was built.
instead of paid CI minutes
Opens a pull request for every new version each Monday. Small tools update themselves after checks pass. Databases and control-plane parts wait for a human.
instead of forgotten upgrades
What every product talks to.
A Kafka-compatible event log on three brokers. Each product writes only to topics under its own name, and topics are files in the repo, created and removed with the code.
instead of Confluent Cloud or SQS
Transactional email and an in-app inbox, on its own MongoDB replica set. Notification designs live in the product's code as React Email templates. Previews send to a test inbox, so a test never emails a real person.
instead of Knock or Courier
The front door. A form asks for a name and who the customers are, then opens the pull request that creates the product. It also lists every service and who owns it.
instead of a wiki page nobody updates
Leaves of wave 7: they start last, and nothing waits for them. If the CRM or the campaign tool fails, products keep shipping.
One Twenty for the whole platform, one workspace per product at crm-<slug>.xupisco.com, plus a -dev workspace for previews. Our build lifts the open-source edition's limit of five workspaces, and that source is public on our Git server.
instead of HubSpot or Salesforce seats
One Plunk for the whole platform, one campaign space per product, sending from <slug>.news.xupisco.com. Sequences live in the product's code, with double opt-in and one-click unsubscribe. SES delivers. A watch on bounces and complaints pauses sending if they rise. Our fork adds Keycloak sign-in, and its source is public.
instead of Mailchimp or Loops
The products themselves.
Defines what a Project file may say (name, B2C or B2B, payments, campaigns) and how Crossplane builds it. The cluster rejects a file that breaks the rules before anything is created.
instead of tribal knowledge
wiseresume, wiserecruit, demo2 and b2b, each with its own database, sign-in realm, CRM workspace and verified campaign domain. Two pull-request previews are open as of 1 October 2026.
instead of one shared app for everything
How it moves
Every change is proven in an isolated copy of the product before it merges. Production data and real customers are never involved.
Opening a pull request creates a full environment with its own database, cache, bucket and topics. Closing it removes everything.
<slug>-pr-<n>pr-<n> imagesMerging to main is the deploy. Nobody runs a command against the cluster.
maindeploy/ to prodThe bill
The savings don't come from one trick. Each paid line item a startup usually carries is either shared across products or gone.
Rackspace Spot rents idle capacity at market price, well below on-demand VMs. Stateful services stay on a stable pool, and interruptible work runs on cheaper nodes.
All traffic arrives through one outbound Cloudflare tunnel, so we pay nothing for load balancers or static IPs.
Auth, CRM, notifications, CI and monitoring are open source. Adding a customer or a teammate adds no license fee.
Every product shares the same Keycloak, Novu, Redpanda and Grafana. The tenth product costs about what its own database and pods need.
A preview lives only while its pull request is open, with a cap per product, so test environments don't pile up.
Where a service is cheaper than running our own, such as SES for bulk email or B2 for backups, we pay per use and nothing more.
Every tool on this page is open source. Put together, they let one small team run many products.