Share pages
Create and manage client share pages with slug, description, visibility, expiry, and view counts.
NeedClients need one branded link—not a Drive folder dump.
ValueFaster reviews and stronger proposal presentation.

ProjectsCase StudyInternal Tool2026
Case Study
The private content desk behind zohaibnawaz.dev—Share Studio, Hire Forms, leads, manager RBAC, and draft approvals on a shared Supabase database.
The private content desk behind zohaibnawaz.dev—Managers draft, Admins publish, and the live portfolio stays in sync on a shared Supabase database.
ZN CMS is an invite-only ops console for one personal portfolio: Share Studio pages, Hire Forms and applications, team roster, contact leads, manager RBAC, draft approvals, and realtime notifications—not a multi-tenant SaaS CRM.
ZN CMS is the staff-facing half of the personal brand system. Public hire and share URLs live on zohaibnawaz.dev; editors manage the same records from a private Dashboard so the live site never becomes the editing surface.
Access is invite-only. An Admin owns the workspace; Managers get viewer / editor / publisher presets with per-module caps. Sensitive edits go into draft_data until Admin approval—so public content is never half-published by accident.
Active modules cover Share pages, Hire forms and submissions, Team (approved applicants), Leads with a realtime inbox, Managers, Approvals, and Notifications. Projects and Media are scaffolded for later content sync.
Technically it is a Makerkit-lite Turborepo fork constrained to a single workspace: Next.js App Router, Server Actions, Supabase Auth + RLS + Realtime, and CSRF on mutating requests.
Portfolio content, proposals, hire applications, and contact leads lived across the public site UI, Drive folders, email, and ad-hoc notes—with no clean draft → review → publish path for collaborators.
A personal practice that ships proposals and hiring flows needs the same discipline as a product team: clear roles, non-destructive review, and a live ops inbox—without opening a public CMS to the world.
ZN CMS keeps portfolio operations in one private desk that shares a database with the live site:
CMS and zohaibnawaz.dev read/write the same hire, share, leads, and profile tables—public URLs stay on the portfolio.
Invite-only Managers with viewer/editor/publisher presets and per-module view/add/edit/delete/publish caps.
Manager edits write draft_data; live blocks stay intact until Admin approve/reject.
Leads inbox and notification bell update over Supabase Realtime as inquiries and reviews land.
Structured hire submissions can be approved into the team roster instead of living in email forever.
One private console for share/hire/leads ops, safer collaborator access, and a live portfolio that only shows Admin-approved content.
Create and manage client share pages with slug, description, visibility, expiry, and view counts.
NeedClients need one branded link—not a Drive folder dump.
ValueFaster reviews and stronger proposal presentation.
Compose pdf, link, note, file, and pricing blocks on a single share page.
NeedProposals and deliverables need different formats in one place.
ValueOne share URL covers the full package.
Manager edits land in draft_data; Admin Approvals publish without overwriting live pages mid-edit.
NeedPublic /share/[slug] URLs on the portfolio must stay stable.
ValueSafe collaborator editing for client-facing links.
Job/application forms, submission inbox, rich applicant payloads and files.
NeedHiring needs structured intake and review.
ValueApplications stay inside the same system as the public apply link.
Candidates complete multi-step apply on zohaibnawaz.dev; staff triage in the CMS Hire inbox.
NeedPublic apply and private review should not share one UI.
ValueClean handoff from candidate to Admin/Manager.
Approved hire submissions become team member profiles.
NeedAccepted applicants should not restart in another tool.
ValueShort path from application to internal roster.
Contact-form leads with status pipeline new → contacted → qualified → won/lost; search and filters.
NeedInquiries need triage, not an unread email pile.
ValueClear follow-up state for serious conversations.
Leads and notifications update live via Supabase Realtime.
NeedOps desks go stale if staff must refresh constantly.
ValueFaster response when a lead or review arrives.
Per-user bell for lead events, hire submissions, content reviews, and manager permission changes.
NeedImportant events should surface without opening every module.
ValueLess missed work for Admin and Managers.
Admin invites/removes Managers; presets and per-module flags; optional delete and approval requirements.
NeedCollaborators need scoped power, not owner keys.
ValueSafe division of labor on a single brand site.
Admin queue to approve/reject pending Share and Hire drafts without breaking live content.
NeedPublish must stay intentional.
ValueNon-destructive review before anything goes public.
Public signup disabled; Admin-driven invites with link fallback when email is rate-limited.
NeedThis is a private desk, not a self-serve SaaS.
ValueHard boundary against random account creation.
Module overview cards with share/hire/team/leads counts and pending reviews.
NeedStaff need a single morning view.
ValueFaster orientation before diving into a module.
Scaffolded Dashboard modules for future portfolio case-study and asset sync.
NeedREADME positions deeper content sync as the next layer.
ValueHonest roadmap without pretending those modules are finished.
Admin invites Manager with Share editor access
Manager signs in to Dashboard
Creates or edits a share page
Changes land in draft_data
Admin reviews Approvals and publishes
Public portfolio URL serves the live version
Candidate opens hire apply link on zohaibnawaz.dev
Completes multi-step form and uploads documents
Submission appears in CMS Hire inbox
Staff review; optional approve into Team
Notification alerts relevant users
Visitor sends a contact inquiry on the portfolio
Lead appears in CMS Leads over Realtime
Staff update status through contacted → qualified → won/lost
Notification keeps the team aligned
Forked Makerkit lite / Turborepo, then constrained to one Admin workspace instead of multi-tenant orgs.
Business valueSerious kit ergonomics without shipping a public multi-tenant product.
CMS and zohaibnawaz.dev share Supabase tables for hire, share, leads, profiles, and notifications.
Business valueOne source of truth—public site and ops desk never drift.
Manager writes go to draft_data; live columns stay public until Admin approve/reject.
Business valueCollaborators can work without risking broken client pages.
Module flags × preset × canDelete / requiresApproval, enforced in Server Actions via assertCapability.
Business valuePermissions match real ops roles instead of a blunt admin toggle.
Leads inbox and notification feed subscribe to Supabase Realtime.
Business valueStaff see new work as it lands.
RLS everywhere, service role server-only, CSRF on mutations, signup blocked, secret-rotation notes in README.
Business valuePrivate ops data stays behind the same discipline as a public product.
| Challenge | Solution |
|---|---|
| Needed collaborator editing without letting Managers overwrite live portfolio content. | Draft_data workflow with an Admin Approvals queue before publish. |
| A full multi-tenant SaaS kit did not match a single personal brand workspace. | Constrain the fork to one workspace owner and invite-only Managers. |
| Public hire/share URLs and private ops needed to stay in sync. | Shared Supabase schema—portfolio serves public pages; CMS owns staff workflows. |
| Leads and reviews arrive asynchronously and get missed in email. | Realtime leads inbox plus typed in-app notifications. |
| Marketing copy listed Projects/Media before those modules were real. | Ship Share/Hire/Leads/Managers first; keep Projects/Media as explicit WIP scaffolds. |
Recommended capture order for the case-study gallery.
For a personal brand, the CMS should be a private companion—not a second public product. Positioning “built for one site” prevents the wrong expectations.
Draft vs live is the unlock for collaborator workflows on content that already has public URLs.
Sharing one Supabase project between portfolio and CMS beats syncing two databases—if RLS and capability checks stay strict.
Ship the modules that already have public surfaces (Share, Hire, Leads) before scaffolding aspirational ones (Projects, Media).
| Priority | Improvement | Business value |
|---|---|---|
| High | Projects module wired to portfolio case-study content | Edit work entries in CMS without touching the site repo for every change. |
| High | Media library with Storage-backed assets for share/hire and future projects | One place to manage images used across the brand system. |
| Medium | Richer lead activity timeline and email/reply hooks | Faster follow-up without a separate CRM. |
| Medium | Audit log for publish/approve/reject and manager permission changes | Clearer accountability on a multi-manager desk. |
| Low | Deeper analytics on share-page views inside the CMS | Better timing on proposal follow-ups. |
ZN CMS is a case study in invite-only RBAC, draft approval, and a shared Supabase backend with a live portfolio—not a multi-tenant CMS for everyone. If you want the same clarity for your product or practice, start a conversation.
Start a conversationHow the CMS and portfolio stay one system without becoming a public SaaS.
zohaibnawaz.dev is the public brand showcase (and serves noindex recipient URLs like /share/[slug] and /hire/[job]). ZN CMS is Share Studio and Hire ops—create, draft, approve, and triage—plus leads, managers, and notifications.
Both talk to the same Supabase project so share pages, hire submissions, and contact leads never need a sync job. The portfolio case study stays about craft; this CMS case study owns the signed-in delivery workflow.
The Makerkit lineage includes multi-tenant patterns; this product deliberately collapses to one workspace owner. Managers are collaborators with presets, not org owners of their own tenants.
assertCapability on Server Actions plus RLS keeps the capability matrix honest even if a UI path is wrong.
Share, Hire, Team, Leads, Managers, Approvals, and Notifications are the live story. Projects and Media exist as Dashboard shells for future portfolio content sync—and should be framed that way in any public case study.
Full Stack Product Engineer
Personal brand ops / internal CMS
2026
Solo build
Next Project