The problem
Job discovery in Nepal happens through Facebook groups and word of mouth, which means opportunities reach whoever happens to be in the right group that day. AwasarHub puts postings, profiles and a feed in one place so a candidate can be found rather than having to be already connected.
What I built
The backend is Django REST Framework serving a React client. Auth is token based with refresh handling, and the feed is paginated on the server so a growing post table never turns into a growing payload.
Profiles, job postings and applications are separate apps with their own permissions, which kept the authorisation rules readable as the feature set widened.
The React side uses Vite and TailwindCSS, with data fetching kept in a small set of hooks rather than scattered through components.
Architecture
Django REST Framework for the API, React and Vite for the client, PostgreSQL for storage, Redis for session and feed caching.
The feed query is the hot path, so it is indexed on the author and created timestamp and served from a cached page slice that is invalidated on write rather than on a timer.
Problems worth writing down
Feed pagination
Offset pagination drifts when new posts arrive mid scroll. Switching to cursor pagination on the created timestamp fixed the duplicates.
Permission sprawl
Job posting, applying and moderating all needed different rules. Moving them into DRF permission classes per app stopped the view logic from branching.