Find organizations
Browse by help category or search by name or service; featured and verified organizations first.
Public appA founder-engineer case study · iOS · Web · Supabase
Help in Panama is spread across many independent organizations, each with its own phone numbers, forms and way of giving. I built one platform for all of them: a three-language iPhone app where people find help, borrow medical equipment, donate and volunteer, with a staff workspace, a web admin portal and a secure multi-tenant backend behind it.
The short version
JESED PTY is a community-support platform for Panama that I created and run. Its iPhone app (React Native + Expo) lets people find local organizations, request help, reserve medical equipment, donate and volunteer, and gives organization staff their own workspace in the same app. Behind it are a Next.js website and admin portal and a multi-tenant Supabase backend (PostgreSQL with row-level security, Edge Functions, card donations through a Panamanian payment processor), in Spanish, English and Hebrew (right-to-left). Version 0.1.0 was submitted to Apple App Review on October 22, 2026. I built it with AI coding assistants under my direction and operate its production systems myself. My goals for its next stage are 70+ partner organizations, 15,000 users and $25,000 in monthly donations: targets, not current results.
The problem
In Panama, much community support is offered by independent organizations — medical assistance, equipment loans, food, financial help, clothing, housing. Each one has its own phone numbers, forms and way of accepting donations.
A family that needs a wheelchair for a month, or help with rent, has to already know whom to ask. Organizations, in turn, juggle requests, equipment loans, volunteers and donations across chats and spreadsheets.
The solution
One app for the whole community. People search every organization in one place and act in a few taps. Each organization's staff use the same app, routed to a staff workspace, and platform administrators use a web portal — all on one backend where each organization's data stays isolated from the others.
Organizations, services and request forms are configured as data, not code, so the platform grows without per-organization app updates.
Browse by help category or search by name or service; featured and verified organizations first.
Public appStep-by-step request forms that each organization defines, with document uploads and status tracking.
Public appBorrow wheelchairs, hospital beds and more, with pickup and return dates.
Public appCard donations with an itemized fee choice, campaigns, in-kind donations and volunteer applications.
Public appEvery request, reservation and donation in one timeline, chat with organizations, and push notifications.
Public appStaff manage requests, reservations, inventory, campaigns and their team in the app; JESED administrators run the platform on the web.
Organizations · AdminsInteractive demo
A faithful web re-creation of the iPhone app's public side: the same five tabs, screens, colors and icons, and — word for word — the app's own English, Spanish and Hebrew text. Tap anything.
This demo runs entirely in your browser. It has no login and no connection to JESED PTY's servers, database or payment processor, so nothing you do here reaches a real organization or person.
Web re-creation for demonstration. The real app is native iOS (React Native); the organizations and people shown here are fictional.
Engineering behind the app
Three applications on one backend: the iPhone app (for the public and for organization staff), the Next.js website and admin portal, and Supabase — where security is enforced in the database itself.
Counted from the project's source repository on October 29, 2026. The repository also holds 66 pgTAP database-security test files (1,339 planned assertions), 41 node:test files and 12 Playwright end-to-end specs.
Problems worth solving
0013_row_level_security.sql · supabase/tests/database/
0001 role enums · prevent_self_permission_escalation (0012) · invite-org-staff
apps/mobile/lib/i18n/index.ts · commit 42678b2
supabase/functions/reconcile-payments
fee migrations 0135–0140 · try it in the demo
0144_users_language_from_signup.sql
-- ── organizations ─────────────────────────────
create policy organizations_public_read on public.organizations for select using (
status = 'active' or public.is_super_admin() or public.is_org_staff(id)
);
create policy organizations_super_admin_insert on public.organizations for insert with check (public.is_super_admin());
create policy organizations_super_admin_delete on public.organizations for delete using (public.is_super_admin());
create policy organizations_update on public.organizations for update using (
public.is_super_admin() or public.has_org_role(id, array['org_admin']::org_staff_role[])
);
-- column-level enforcement of locked fields happens in enforce_organization_field_locks() (0012)
Access rules live in PostgreSQL, so even a modified client can't read or change another organization's data.
// Statuses that mean the ball is in the USER'S court (or time-sensitive for them). These cards get
// a highlighted attention line and count toward the filter-tab badges — before this, a card
// waiting on the user's documents looked identical to one merely submitted, so requests stalled.
const ATTENTION_KEYS: Record<string, string> = {
information_required: "myActivity.attentionInfoNeeded",
more_information_required: "myActivity.attentionInfoNeeded",
documents_required: "myActivity.attentionInfoNeeded",
interview_required: "myActivity.attentionInfoNeeded",
ready_for_pickup: "myActivity.attentionReadyForPickup",
return_due: "myActivity.attentionReturnDue",
overdue: "myActivity.attentionOverdue",
};
My Activity merges six kinds of records into one timeline and surfaces the ones waiting on you — try it in the demo above.
create or replace function public.users_language_from_signup()
returns trigger
language plpgsql
security definer
set search_path = public
as $$
declare
signup_locale text;
begin
select raw_user_meta_data ->> 'locale' into signup_locale from auth.users where id = new.id;
if signup_locale in ('es', 'en', 'he') then
new.preferred_language := signup_locale;
end if;
return new;
end;
$$;
revoke all on function public.users_language_from_signup() from public, anon, authenticated;
A new account starts in the language it signed up in, so its emails arrive in Spanish, English or Hebrew — fixed on the server, without touching the app build under Apple review.
What I built
Initiative, decisions and ownership, with an honest account of how the code was written.
I created JESED PTY and took it from a working codebase to an app submitted to Apple. I own and operate every part of it: the source repository, the Supabase projects, the website and its hosting, the domain, the Expo account, and the Apple developer account the app is submitted under.
I developed it with AI coding assistants — mainly Claude Code — as pair programmers. Most commits in the repository are marked as co-authored with Claude. I decided what to build, directed and reviewed the work, tested it, and approved every change that reached production.
Development evidence
These are the App Store screenshots submitted with Build 32, captured from the actual app. Select one to view it full size.
Milestones from the commit history
App Store status
The app has not been approved or published on the App Store yet.
jesedpty.com — public site, support and privacy pages, and the admin portal sign-in.
Where it's going
JESED PTY works today and is waiting for its App Store debut. These are the scale objectives I have set for what comes next.
These are goals, not results. The app has not been published on the App Store yet, so there is no public user base or donation volume to report. The figures describe the scale I am working toward; they are not a dated forecast, and they don't imply any partnership that doesn't exist.