multitenant-development
SKILL.md
Multitenant Development
Quick Start
When working with multitenant features:
- Always verify tenant with
getTenantFromRequest()in APIs and middleware - Never make queries without filtering by
tenant_id - Ensure RLS policies include tenant verification
- Configure tenant-specific assets in
public/tenants/{tenant_slug}/ - Usar
getTenantAssetPath(tenant, assetPath, fallback)para URLs de assets (incluye cache busting?v=por deploy)
Key Files
src/lib/tenant/tenant-service.ts- Main tenant servicesrc/lib/tenant/tenant-assets.ts- URLs de assets con cache busting (Supabase o local)src/middleware.ts- Tenant detectionsrc/components/TenantThemeStyles.tsx- Tenant stylessupabase/migrations/*- RLS migrationsoptimize-pintemas-assets-upload.js- Subir assets de tenants al buckettenant-assets
Common Patterns
API with Tenant Isolation
import { getTenantFromRequest } from '@/lib/tenant/tenant-service';
import { createClient } from '@/lib/supabase/server';
export async function GET(request: NextRequest) {
const tenant = await getTenantFromRequest(request);
if (!tenant) {
return NextResponse.json({ error: 'Tenant not found' }, { status: 404 });
}
const supabase = createClient();
const { data, error } = await supabase
.from('products')
.select('*')
.eq('tenant_id', tenant.id);
if (error) {
return NextResponse.json({ error: error.message }, { status: 500 });
}
return NextResponse.json(data);
}
RLS Policy
CREATE POLICY "tenant_isolation_products" ON products
FOR ALL
USING (
tenant_id = (
SELECT id FROM tenants
WHERE slug = current_setting('app.tenant_slug', true)
)
);
Tenant Assets
Usar getTenantAssetPath() para que las URLs lleven cache busting y se actualicen tras cada deploy:
import { getTenantAssetPath } from '@/lib/tenant/tenant-assets';
const tenant = useTenant();
const logoPath = getTenantAssetPath(tenant, 'logo.svg', '/images/logo/logo.svg');
const primaryColor = tenant.primary_color || '#ea5a17';
- Assets en Supabase: bucket
tenant-assets, rutatenants/{slug}/.... Subir connode optimize-pintemas-assets-upload.js. - Tras cambiar assets: hacer deploy y purgar caché CDN (
npm run cache:purgeo Vercel → Settings → Caches) para que se vean pronto en todos los dispositivos. Verdocs/CACHE_PURGE_ANTES_DEPLOY.md.
Checklist
- Verify tenant in each request
- Include
tenant_idin all queries - Verify RLS policies are active
- Test with multiple tenants
- Verify data isolation
- Configure tenant assets if needed
Weekly Installs
11
Repository
santiagoxor/pin…-digitalFirst Seen
Feb 28, 2026
Security Audits
Installed on
gemini-cli11
opencode11
codebuddy11
github-copilot11
codex11
kimi-cli11