Skip to content
Ali Hassan — home

Work

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
Quotes manager, image categories and audio library in the dashboard a small team uses to run a content app.

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

Ali Hassan in a dark winter jacket, looking off to one side, standing in a stone courtyard with a minaret and cloudy sky behind him.