Expertise Vercel / Supabase

Your website can be part of the way your business works.

A catalogue fed by your shared data. An enquiry that reaches the right workflow. A back office your team can run. We help you put those pieces together.

Four years building and evolving tools inside an employment and education group. That experience belongs to Julien Cyr, Ownward’s founder, and informs these anonymised cases: one business environment, several connected products.

Give each tool a clear job

One foundation. More possibilities. Shared data · Team workspace · Connected site

Airtable remains useful for the people maintaining the offer. Supabase provides PostgreSQL, authentication and storage. Next.js on Vercel builds the public or signed-in experience around that data.

We define which system owns each field, what is published and who maintains it. A web-facing copy has a clear purpose; it is not another reference for people to maintain by hand.

How we organise the code · monorepo

Several applications. One shared foundation.

A monorepo keeps the code for related applications in one versioned repository. The website, back office and client portal can share their design system and business contracts while remaining separately deployed applications.

  • Public website
  • Back office
  • Client portal
  • App hub

Shared packages: brand · components · types · data-access helpers

Consistency you can see

At Ownward, the same palette, Source Sans 3 fonts and logo components now serve all four spaces. A brand change has one source, then each application is rebuilt and checked.

Changes you can follow

pnpm workspaces connect the packages; Turborepo coordinates dependent tasks and caches eligible build work. Related changes, documentation and agent instructions stay reviewable together.

Each application keeps its boundaries

Each app has its own Vercel project and release. Shared code does not grant shared access: sessions, permissions, secrets and tenant isolation still require explicit controls.

Useful when several products evolve together. We define package ownership and compatibility before sharing code. A code rollback does not restore database state.

Monorepos on Vercel

From data to product

A website that works with the rest of your tools.

Explore the connected catalogue, enquiry capture and publishing across websites.

Product & governance

Share the content. Keep control of each website.

It started with…

Several websites share parts of their offer and content. Copying pages between them makes every correction harder to follow.

So we built…

A page model linked to websites: each site has its domains, theme and publishing scope. Shared pages retain explicit links to where they appear.

Technologies & official documentation

From shared content to its websites
  1. Supabase

    Shared content

    Pages and versions

  2. Supabase

    Publishing scope

    Page × website links

  3. Vercel

    Render by domain

    Website theme and navigation

Simplified diagram of the reviewed model.

What we set out to change

Reuse content while making publishing decisions explicit for each website.

How it is builtData model, code, controls and team ownership

The user journey

  1. 01

    Create or enrich the shared page.

  2. 02

    Preview it in each website’s context.

  3. 03

    Publish the approved version to selected websites.

Data and hand-off structure

Entity / tableKey fieldsRelationships
Websites & domainsHost · theme · scopeOne site → several domains
PagesContent blocks · version · statusOne page → several site links
Page/site linksSite · page · local slug · publishedExplicit publication per website

Technical implementation

  • The host resolves the current website; a junction table links its pages.
  • Preview snapshots and published versions are distinct.
  • Components share a data contract while allowing presentation choices per website.

Engineering decision

Publish one page selectively across several sites

Adapted from the public branch of the multi-site page resolver. Both the site/page association and the page status must allow publication; SEO overrides apply to that association. The database client uses public read policies. Preview and admin access are deliberately separate and are not exposed through a visitor-controlled boolean in this excerpt.

TypeScriptresolve-public-page.ts28 lines
import "server-only";import { createPublicClient } from "./database";import { parsePageContent } from "./content-schema";export async function resolvePublicPage(siteId: string, localSlug: string) {  const db = await createPublicClient();  const { data: link, error } = await db.from("page_site_links")    .select(`      local_slug, is_published, seo_overrides,      pages!inner(id, title, content, seo, status)    `)    .eq("web_site_id", siteId)    .eq("local_slug", localSlug)    .maybeSingle();  if (error) throw new Error("Page lookup failed");  if (!link?.is_published) return null;  const page = link.pages;  if (!page || page.status !== "prod") return null;  return {    id: page.id,    title: page.title,    content: parsePageContent(page.content),    seo: { ...(page.seo ?? {}), ...(link.seo_overrides ?? {}) },  };}// siteId is resolved from the trusted hostname/site mapping.// Public row policies and a unique (web_site_id, local_slug) are required.

Adapted implementation excerpt

Publish one page selectively across several sites

Controls and boundaries

  • Scope checks are needed on every read and write.
  • Private previews must protect both content and media.
  • Code rollback, editorial versions and data restoration need separate plans.

Who can contribute

  • Communications: content and publishing.
  • Administrators: websites, domains and access.
  • Developers: components, migrations and scope checks.

What supports this case

Multi-site model, publishing relationships and preview flow reviewed in the repository. This describes the implementation, not a completed security audit.

Working with Ownward

Built together. Then yours to grow.

Your team should be able to handle everyday changes. And know who to call when a problem needs deeper technical expertise.

  1. 01

    Start with the work

    We define the need, each tool’s responsibility and a first version that can be verified, then build the workflow with the team.

  2. 02

    Learn on your own tools

    Your team learns on the delivered product: configuration, monitoring, diagnosis and everyday changes, with the documentation and repository at hand.

  3. 03

    Go further, with support

    Citizen developers, developers and colleagues coding with Claude can contribute to the same documented model. We support complex integrations, code reviews and technical escalation as your needs evolve.

The details that make a delivery useful

The tool, and what your team needs to own it.

Our Ownward delivery standard: guidance stays inside the product, knowledge stays with the code, and coding agents have the context to contribute.

  • An onboarding wizard you can always reopen

    A guided path through roles, essential setup and the first useful action. It remains available from Help, including when a new colleague joins.

  • Documentation in the delivery repository

    Getting started, data model, configuration, integrations, tests, release and rollback: the explanations evolve with the product version. Secrets stay outside the repository.

  • Instructions for coding agents

    AGENTS.md and, where useful, CLAUDE.md describe the architecture, conventions, checks and change rules. An agent extends the shared model; the team retains review and release decisions.

See guided onboarding in a real interface
Deployment, access and product evolution

Previews let teams review a change before release. PostgreSQL policies and application permissions enforce access, with privileged keys kept on the server. Checks need to cover denied access as well as allowed access.

Returning to a previous Vercel deployment does not restore the database. Migration compatibility, backups and recovery need their own plan.

Which part of your work could be easier?

Bring the process, the friction or the idea. We can start there.

Talk about your project