Back to Portfolio
In Development

Cylro Logo Cylro Logo Website Operations Platform

The website operations platform we're building for teams that create and manage multiple public-facing websites.

Last updated: 09/09/2026

Plain-English view, built for everyone Full technical detail
Pre-release
private alpha we're targeting for around November 2026
1
Space holding an organisation's sites, people, access, and publishing
Static
output we publish into object storage, instead of a container per site
2
of us building the product and running the company

How it fits together

One Space, many sites
Studio and modules
Nuxt 4 · SSR Blog FAQ Collections Forms
page structure, blocks, content and media, per website
Cylro backend
Node.js Express SuperTokens
Spaces, roles, Crews and website scopes
Data
PostgreSQL pgvector Redis
PostgreSQL with pgvector, and Redis for cache
Static delivery
S3 compatible custom domain CDN next
served straight from storage, with no container per site

No client ever reaches the database, the storage or the identity service on its own. Studio, the modules and every permission check go through the one backend, and what a visitor finally loads is plain static files rather than a running container for each site.

What we're building Cylro to do

Run many sites from one Space

A Space brings your websites, people, access, teams, and operational context together, instead of one isolated installation per site.

Give editing one workspace

We're building Studio for page structure, visual design, reusable blocks, content, media, and themes, per website.

Add only what a site needs

You enable modules such as Blog, FAQ, Collections, and Forms per website, instead of stacking plugins on every site.

Publish with a way back

Sites publish as static output, and we're building versioned publishing so you can restore an earlier version or take a site offline.

Technical foundations

Server-rendered Nuxt frontend

Nuxt 4 with SSR, Vue 3, Pinia, and Tailwind CSS. I keep it as a separate layer that only reaches the product through our backend API.

One backend as the controller

I run API access, authentication, permission checks, rate limiting, publishing, and deployment workflows through one Node.js and Express layer.

PostgreSQL, pgvector, Redis

PostgreSQL holds our structured application data, pgvector is in place for where we're heading with AI, and Redis is the caching layer.

Static delivery from object storage

We export sites as HTML and assets into S3-compatible storage and serve them over a custom domain, with CDN delivery as the next step.

The Idea

We're building Cylro for organisations that create and manage multiple public-facing websites across clients, brands, and internal teams.

We want websites to be easier to create, organise, publish, and maintain, without every organisation having to assemble its own separate CMS, hosting, domain, media, access, and publishing systems.

We keep the focus deliberately narrow: company websites, landing pages, portfolios, blogs, and content hubs. Cylro isn't a general application-hosting platform, and it isn't a build-anything-with-AI product.

Why This Exists

01

It started with my own frustration: separate CMS installations, plugins, hosting dashboards, domains, and the same setup work repeated for every new website.

02

Our first idea was an open-source CMS that organisations could self-host or run as a managed service. Working through it, we found the harder problem was operations rather than the editor: who's allowed to change what, how a change goes live, and how you get back when it shouldn't have.

03

That turned into one website operations platform for many sites: Spaces, Studio, structured editing, design systems, access boundaries, controlled publishing, and lightweight static delivery. We're reimagining website operations, not claiming to have invented a category.

Inside a Space

Spaces

A Space is your organisation's working environment and ownership boundary: your people, access, websites, teams, and the responsibility for keeping those sites maintained.

Crews and roles

We built Crews for agencies and larger teams with specialised people on different clients. Roles and scoped permissions decide who can view, edit, publish, or manage. We'll settle the exact vocabulary during the alpha.

Studio

The website workspace: settings, page structure, visual design, reusable blocks, content, media, and themes for one site, wired into the operational controls of the wider Space.

Design system

A design layer for components, structural rules, colours, themes, fonts, icons, and brand guidelines. Shared styling applies consistently across a site, or a designer can switch it off when they want direct control.

On top of that, modules add specialised capability only where a site needs it. Turn on the blog module and that website gets an area for writing articles, editing them, adding images, and managing related content. Collections and the modules we add later follow the same principle, because we don't want to end up with an unstructured plugin collection. Settings, domains, SEO, forms, client-facing access, and analytics are things we're still shaping.

Publishing and Recovery

STEP 01

Build it in Studio

You put a website together in Studio, then our backend runs the build and publishing workflow for it.

STEP 02

Publish as static output

We export the result as HTML and static assets into object storage, where a custom domain, and CDN delivery, can serve it to your visitors.

STEP 03

Keep a way back

We're making publishing versioned, so you can go back to a previous published version, restore it, or take a website offline.

These are controls you trigger yourself. We don't promise automatic rollback, automatic failover, or guaranteed recovery times.

My Role

I co-founded Cylro with Jim and I'm its technical lead and CTO. I set the technical direction and work hands-on across backend architecture, infrastructure, deployment, security, data flow, service boundaries, and how we design the AI integration.

Jim leads the visual, frontend, and product-vision side. We share the product decisions, the company administration, and the business direction, and we run the whole thing as a two-founder team.

Company Timeline

2025

We start Cylro

Jim and I start Cylro in Luxembourg, moving from an open-source CMS idea to one platform for website operations.

2026

Landing page live, product in build

cylro.com is public and people can request early access, while we keep building the platform itself.

NOV 2026 · TARGET

Private alpha

We're targeting a private alpha for around November 2026, if we're ready, to see how deployment, updates, failures, recovery, and the gaps in the product hold up in real conditions.

Current Status

Cylro is pre-release and we're still building it. Our landing page is live and you can request early access through cylro.com, but the product isn't open for general use. We're not making any availability, pricing, or service commitments yet.

How I built it

I built Cylro as one multi-website application rather than a collection of isolated site installs. A Space gives websites, people, and access their organisational context; I keep the Nuxt frontend as its own layer; and the Node.js backend is the single controlled path to data, permissions, publishing, and service coordination. We publish the websites themselves as static output, which keeps a live site independent of the application that produced it.

Frontend: Nuxt 4, server-rendered

Nuxt 4Vue 3PiniaTailwind CSSSSR
  • A layer of its own: I keep the frontend separate from the backend so it can evolve on its own and stay easier to maintain.
  • API-only access: Nuxt talks to the backend through an API. The client never queries the database directly.

Application layer: Node.js and Express

Node.jsExpressREST APIRate limiting
  • One controller for the product: I route API communication, data access, authentication, permission checks, rate limiting, publishing, deployment workflows, and service coordination through the backend.
  • Rules in one place: I enforce our product rules at the backend boundary instead of re-implementing them per client or per service.
  • The path for future AI actions: I'm designing the AI capabilities we plan to act through this same backend, not around it.

Data and caching

PostgreSQLpgvectorRedisJSON columns
  • PostgreSQL as our system of record: open source, widely supported, and flexible enough for our structured application data, with JSON where that helps.
  • pgvector for where we're heading with AI: I've made room for vector search, contextual retrieval, and semantic lookup. That's direction, not a public feature we've shipped.
  • Redis as the caching layer: the backend reads frequently requested and short-lived data from Redis first, which cuts repeated reads against PostgreSQL.

Identity and access

SuperTokensRolesCrewsScoped permissions
  • SuperTokens behind the backend: I chose it over our earlier Keycloak direction because it fit our authentication and backend-connection requirements better. Keycloak is no longer part of the stack.
  • Identity isn't the permission model: SuperTokens establishes who someone is. Our backend connects that identity to Spaces, roles, Crews, website scopes, product actions, and publishing rights.
  • Room for separate identity contexts: I designed the architecture so we can later handle external website visitors separately from the people operating a Space.

Publishing and delivery

Static exportS3-compatible storageCustom domainsCDNVersioned publishing
  • Static output instead of a container per site: a build produces HTML and static assets, so I don't run a dedicated application container for every customer website.
  • Object storage as the origin: we store the published output in S3-compatible storage and point a custom domain at it, with CDN delivery for reach and to keep pressure off our application servers.
  • Rollback and recovery you trigger yourself: going back to a previous published version, restoring it, or taking a site offline are your actions. We don't promise automatic rollback, automatic failover, or guaranteed recovery times.
  • Dynamic behaviour in the browser: client-side JavaScript covers what a static site needs, so we don't have to server-render every page permanently. E-commerce and heavier dynamic cases are future work.

Containers and infrastructure

DockerDocker ComposeService boundariesHetzner (direction)
  • Separate services, separate responsibilities: I designed the Nuxt frontend, Node.js backend, PostgreSQL, Redis, the authentication service, and the supporting services as distinct container boundaries.
  • Docker for development and delivery images: Compose covers our local development and delivery-image workflows. It isn't what I intend to run in production.
  • Hetzner as our first production provider: affordable compute, suitable storage, and good S3 pricing for a company at our stage. We may look at Scaleway, OVH, and other European providers later.
  • Deployment platform still being decided: I'm evaluating a visual container-deployment platform for releases, updates, service health, and operational visibility during the alpha. I haven't fixed the final choice or the multi-server approach.

AI orchestration direction

Umbrella agentBounded capabilitiesBackend-enforcedHuman approval
  • Assistance, not our identity: optional help with content drafting, SEO suggestions, review, layout ideas, and routine website or access tasks. We're not trying to replace the people running the websites.
  • The orchestration model I'm planning: you'd talk to an umbrella agent that understands the request and delegates bounded work to specialised capabilities.
  • No unrestricted authority: I'm designing every consequential action to go through the backend, get checked against our product rules and your permissions, be explained back to you, wait for your approval, and only then run.
  • We choose the provider, you don't bring your own model: we provide the AI experience, and we can change model and provider on quality, cost, availability, performance, and European hosting options. The orchestration harness isn't finished, and we have no live public AI features.

Security and operational validation

Backend enforcementContainer healthOperations view
  • No direct client access to core services: sensitive product actions go through the backend, where I enforce permissions, product rules, rate limits, authentication checks, publishing, and operational requests.
  • Monitoring is still evolving: I'm building an internal operations view to bring service status and operational signals together, alongside the baseline container logs and health the deployment platform gives us.
  • What the alpha has to prove: failures, redeployments, restoration paths, backup behaviour, recovery of published site versions, and re-upload and service recovery. Until it has, I'm not claiming uptime, recovery targets, complete monitoring coverage, or production-proven backups.

How we work

GitHubBranchesAI-assistedHuman-reviewed
  • AI-supported, human-reviewed: AI speeds up exploration, implementation, debugging, and code investigation. We keep the product decisions, the technical direction, the review, and the call on what actually enters the product.
  • Validated through hands-on local use: I test changes locally by actually operating the product, not only in isolation.
  • Branch-based work in GitHub: we keep parallel work separate to reduce conflicts while we build.
  • What we don't have yet: a complete CI/CD pipeline, a formal staging environment, and comprehensive automated testing. Those are what I want to strengthen as the alpha forces real release discipline on us.

What I'm Working On

Core product

Getting Spaces, Crews, Studio, the design layer, modules, publishing, and recovery to work as one coherent system rather than separate features.

Deployment and operations

Settling the deployment platform, the operations view, and the backup and restoration paths I want the alpha to put under real pressure.

Private alpha

Preparing a small, closely supported alpha for around November 2026, and being clear about what's ready before anyone starts.