El Rey Jesús
A church website that reads its content live, and an admin panel to edit it without code.

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.
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.



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

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.
Three decisions that shaped it.
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.
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.
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.


