Content admin panel
One dashboard from which a small team manages everything a content app shows: quotes, announcements, images, videos, audio and research links.
- Role
- Full-stack engineer
- Status
- Delivered
- Client
- Content app
- Next.js
- React
- Firebase
- Chakra UI

The problem
- Context
- A small team runs everything a content app shows (quotes, announcements, images, videos, audio and research links) from one dashboard, without an engineer for day-to-day content.
- Constraints
- Six content types each have their own categories, ordering, display dates and status, content ships in many languages, and new team members must be able to set up their own accounts by email without an admin choosing their password.
- What was at stake
- The app is only as current as the team can keep it. Deleting a category must not leave content pointing at something that no longer exists, and invited users need a secure way to set and reset their passwords.
What I built
Content management
Six content types and categories
Quotes, announcements, images, videos, audio and research links each have their own screens, with categories for quotes, images and audio, and an order and display date on quotes so the app shows the right one on the right day.
Fast search and paging
Search uses a lower-cased copy of each title kept on write, so it is case-insensitive without scanning everything, and lists page through results with an exact total.
Many languages
Translations on each item
Quotes, greetings and image names carry translations alongside the original text, added one language at a time from a list of more than a hundred languages.
Data integrity
Deleting a category cleans up after itself
Removing a category updates every item that used it in one batch, so no content is left pointing at a category that no longer exists.
Clearing a field really clears it
Emptying a field on edit removes it from the record instead of storing an empty value, so the app never shows blank placeholders.
Team access
Three roles on every page
Every dashboard page is gated by role (owner, admin or viewer), with user management limited to owners and admins, and any page not explicitly mapped is denied.
Invites and resets by email
New team members receive a time-limited link to set their own password; a forgotten password works the same way, and passwords are stored only as bcrypt hashes.
Tell me what you’re building and where it’s stuck.
I’ll tell you the cleanest path forward, including if it’s “don’t build that.”
Or write tocontact@alihassan.dev
