The context
Knockes is a real-estate marketplace where owners and agents list properties and buyers browse, favorite, and review them. As the platform grew across three distinct account types, its operations team had no unified place to vet listings, manage accounts, or keep an eye on platform health. Rian Infotech built the admin control center that gives operators a single back-office surface, backed by the same Django REST API and Supabase PostgreSQL database that already powered the consumer apps.
The problem, precisely
Moderation and oversight were ad-hoc. Owners and agents could submit listings, but the team had no dedicated workflow to vet pending submissions before they went live, or to feature and reject them at scale.
Three user types, no single console. Buyers, owners, and agents all lived in one backend, but operators had no unified place to search, filter, and action accounts across all three.
No operator-facing view of platform health. Key signals like user counts, active properties, and recent activity were locked in the API with no dashboard surfacing them to the people running the platform.
The admin tool had to grow without rework. The panel needed an architecture that could add features incrementally, and stay usable even when the backend was momentarily unavailable.
What we built ✓ verified in code
Decoupled admin SPA over a REST API
A standalone Next.js 15 (App Router) / React 19 / TypeScript admin single-page app that talks to a separate Django REST Framework backend over a JSON API, with both deployed independently on Railway and data persisted in Supabase-hosted PostgreSQL.
Property moderation workflow
A paginated property list with debounced server-side search and filters for status, category, and city, plus per-listing approve / reject / feature actions and multi-select bulk moderation across pending, approved, rejected, featured, and suspended states.
User lifecycle management
A paginated user list with search, type/status/location/period filters, and stat cards, plus a detail view showing profile, account-health scoring, risk flags, and a filterable activity timeline, with single and bulk activate / block / suspend / verify actions.
Live KPI dashboard
An overview screen with KPI stat cards (total users, active properties, monthly revenue, platform activity), Recharts user-growth and revenue charts, an activity feed, and quick actions, fed by the admin analytics endpoints.
Resilient typed API client
A thin fetch wrapper with a typed response layer that attaches the JWT to every request and wraps each call so the UI returns sensible empty fallbacks and degrades gracefully instead of erroring when the backend is unreachable.
How it works
- 1
Operators sign in through admin-gated auth. Login posts email and password to the Django auth endpoint, which returns a custom HS512-signed JWT stored in localStorage and attached as a bearer token on every request. Route protection wraps the whole app and redirects unauthenticated users to the login screen.
- 2
The dashboard probes the backend, then renders. On load, a health-check connection probe drives a Live Data / Demo Data indicator, then KPI cards, user-growth and revenue charts, and the recent-activity feed render, falling back to local data if the backend is unreachable.
- 3
Listings move through a moderation pipeline. Operators filter the property list by status, open a listing, and approve, reject, or feature it via a status-update call, or select many at once for bulk moderation, after which the list refreshes.
- 4
Users are investigated and actioned. Operators search and filter users, open a detail view with account-health score, risk flags, and an activity timeline, then activate, block, suspend, or verify the account individually or in bulk.
- 5
The backend resolves auth on every request. A custom DRF authentication class decodes the namespaced JWT, checks a database-backed token blacklist, and resolves the user, with short-lived access and long-lived refresh tokens and a logout path that revokes the token.
The outcome
The result is a clean, responsive, extensible admin platform, deployed on Railway with a live demo, that turns scattered marketplace operations into one streamlined control center. Several screens, including the dashboard, user list and detail, and property moderation, are wired to live backend endpoints, while a typed API client, context-based auth, route-level protection, and a reusable UI kit give the codebase a tidy structure that can grow feature by feature without rework.