Skip to content
Case study · 07 / 09← All work

El Rey Jesús

A church website that reads its content live, and an admin panel to edit it without code.

Role
Design and development
Stack
Vanilla JavaScript (ES modules), Supabase (Postgres, Auth, RLS), Cloudinary, Vercel Functions
Home
HomeNo backend: the browser reads Supabase, RLS guards it
(01) The problem

Iglesia El Rey Jesús Zona Norte, in Mar del Plata, changes schedules, events and news often. Every change needed someone who could edit HTML. The church wanted its own team to update the site.

My roleI designed and built the site, the admin panel and the database with its access rules.
(02) ResultsCounted in the code
8tables with Row Level Security
16access policies
6content types editable from the panel
(03) Architecture

Three decisions that shaped it.

  1. 01

    No backend: the browser reads Supabase, RLS guards it

    Why. The site is static HTML with no build. It loads seven tables in parallel with the public anon key. RLS lets visitors read only active rows and lets editors write.

    Trade-off. Content renders on the client, so it appears after load and search engines see an empty shell first.

  2. 02

    Signed uploads through one serverless function

    Why. The Cloudinary secret can't live in the browser. A Vercel function checks the Supabase token and the user's role, then signs the upload.

    Trade-off. Each upload costs two extra calls to Supabase. The function signs whatever parameters it receives.

  3. 03

    One form engine for every content type

    Why. Each content type is a declaration: fields, types, order and visibility. The panel builds the list and the form from it. A new section is a new entry, not a new screen.

    Trade-off. Anything outside the generic form needs a special case in the engine.

(04) GalleryKeep scrolling →
Home
Home · The top of the site, with its locations loaded from Supabase.
Service times
Service times · Weekly services and a countdown to the next one.
Panel login
Panel login · Magic-link sign-in. New users wait as pending until an admin approves them.
Content editor
Content editor · The same generated form edits services, events, news and the team.
(05) What I'd do next
01Prerender the content at deploy or on an edge function, so the first paint and search engines get real text.
02Restrict what the signing function accepts: a fixed folder and a fresh timestamp only.
03Move the base64 images out of index.html, which weighs 150 KB, and serve them from Cloudinary in sizes that fit each screen.
Next project · 08 / 09
Copiados Norte →Landing, back office and ordering app
Case study · 07 / 09

El Rey Jesús

A church website that reads its content live, and an admin panel to edit it without code.

Role
Design and development
Stack
Vanilla JavaScript (ES modules), Supabase (Postgres, Auth, RLS), Cloudinary, Vercel Functions
El Rey Jesús
(01) The problem

Iglesia El Rey Jesús Zona Norte, in Mar del Plata, changes schedules, events and news often. Every change needed someone who could edit HTML. The church wanted its own team to update the site.

My roleI designed and built the site, the admin panel and the database with its access rules.
(02) Results
8tables with Row Level Security
16access policies
6content types editable from the panel
(03) Architecture

Three decisions that shaped it.

01

No backend: the browser reads Supabase, RLS guards it

Why. The site is static HTML with no build. It loads seven tables in parallel with the public anon key. RLS lets visitors read only active rows and lets editors write.

Trade-off. Content renders on the client, so it appears after load and search engines see an empty shell first.

02

Signed uploads through one serverless function

Why. The Cloudinary secret can't live in the browser. A Vercel function checks the Supabase token and the user's role, then signs the upload.

Trade-off. Each upload costs two extra calls to Supabase. The function signs whatever parameters it receives.

03

One form engine for every content type

Why. Each content type is a declaration: fields, types, order and visibility. The panel builds the list and the form from it. A new section is a new entry, not a new screen.

Trade-off. Anything outside the generic form needs a special case in the engine.

(04) Gallery
Home
Home · The top of the site, with its locations loaded from Supabase.
Service times
Service times · Weekly services and a countdown to the next one.
Panel login
Panel login · Magic-link sign-in. New users wait as pending until an admin approves them.
Content editor
Content editor · The same generated form edits services, events, news and the team.
(05) What I'd do next
01Prerender the content at deploy or on an edge function, so the first paint and search engines get real text.
02Restrict what the signing function accepts: a fixed folder and a fresh timestamp only.
03Move the base64 images out of index.html, which weighs 150 KB, and serve them from Cloudinary in sizes that fit each screen.
Next projectCopiados Norte →
Nahuel SantillánEN