Skip to content
DheesoftDheesoft home
Back to work
Case study · University specimen catalog

Dhaka University · Zoology Department Museum

A specimen-cataloging admin app for the Dhaka University Zoology Department's natural history museum — taxonomy-aware records, print-grade QR labels and admin-only access.

  • Live (admin)
  • 2026
  • Public gallery in build
DU museum welcome and role select

By the numbers

Taxonomy fields
9
Admin modules
7
Roles
3
Label printing
QR

01The problem

Dhaka University's Zoology Department keeps a natural history museum that catalogs biological specimens — phylum down to species, with collection date, place, collector, cabinet, shelf and box. The records lived in paper, spreadsheets and a handful of disconnected forms. Nothing tied the specimen to its physical storage, nothing produced a printable label, and there was no audit trail when a specimen moved between cabinets. The department needed a single admin app that captures the full taxonomy, generates print-ready specimen labels with QR codes and is only reachable by department-approved staff — with a public gallery slated to follow in a later phase.

02What we built

  1. 01

    A specimen record with the full Linnaean taxonomy — phylum, class, order, family, genus, species, scientific name, common name and local name — plus collection date, place of collection, collector and date of entry, modelled in Drizzle on Postgres.

  2. 02

    A physical-storage map on every record — cabinetNo, shelfNo, boxNo and specimen type / preservation type — so a specimen in the database always points to a physical location in the museum.

  3. 03

    Print-grade specimen labels under `(print)/specimens/[id]/print` — laid out for adhesive label paper, with a QR code (react-qr-code) encoding the specimen URL so a phone scan opens the live record.

  4. 04

    Admin-only user creation — three roles (admin, staff, viewer), no public signup, no self-invite. Better Auth handles sessions; an admin seed script creates the first account.

  5. 05

    A public `/public/specimens/[id]` route prepared for the visitor-gallery phase, so the same specimen record powers both the staff catalog and the future public museum gallery.

  6. 06

    Disk-mounted image uploads through the Next.js public directory with a Docker volume bind, so specimen photographs survive container rebuilds without an S3 dependency.

  7. 07

    An admin backup endpoint that streams a downloadable archive of the live Postgres dump plus every uploaded specimen image — survival insurance for a single-VPS deployment.

03Stack

Public + visitor (phase 2)

  • Next.js 16
  • React 19
  • Tailwind 4
  • Base UI
  • shadcn/ui
  • react-qr-code
  • recharts
  • Public gallery

Admin app

  • Better Auth
  • 3-role RBAC
  • Admin-only invites
  • react-hook-form
  • Zod
  • Print-grade labels
  • Cabinet/shelf/box
  • Backup + restore

Data + infra

  • Drizzle ORM
  • PostgreSQL
  • Postgres-js
  • Server actions
  • Disk-mounted uploads
  • CSV/Excel export
  • Docker Compose
  • GitHub Actions CI

04Screenshots

05The hard part

The interesting modelling decision was that a specimen record isn't just a row — it's a row plus a physical location plus a printable artifact. Cabinet, shelf and box have to round-trip from the database to a printed adhesive label and back through a QR scan, so a museum staff member can pull a specimen off a shelf, scan the label and pull up the live record on their phone. That meant the QR has to encode a stable, public URL while the catalog stays admin-only — two routes (`/public/specimens/[id]` and `/(admin)/specimens/[id]`) wrapped around the same database row.

The second decision was deliberately leaving the visitor gallery for phase two. The mockups had gamification, XP bars and "discover" specimens, but the department needed a working catalog first. So we shipped the admin slice — auth, specimens CRUD, users, reports, settings, backup — on a single Next.js 16 app with Drizzle and Better Auth, and built the public route signature so the gallery slots in without touching the data model. Less is more on the first slice; the catalog has to be trustworthy before the public sees it.

Your move

Want one built around your operation?

We take on a small number of custom engagements per year. If this looks close to a problem you have, tell us about it.