Home

Published

- 2 min read

Worklist Job Board

img of Worklist Job Board

A job board with proper search. Built to learn PostgreSQL full-text search and payment webhook handling.

Project is no longer running - this is a retrospective.

TL;DR

  • Implemented Postgres full-text search (ranking > naive LIKE).
  • Made payments reliable via server-to-server webhooks (not browser redirects).

Tech Stack: Django PostgreSQL SSLCommerz API

The two interesting bits in this project were search and payments. Everything else was normal CRUD.

Search: why not just LIKE?

LIKE '%python developer%' is the obvious approach. It’s also slow and dumb - no relevance ranking, no stemming, breaks on word order.

PostgreSQL has built-in full-text search. You create a SearchVector on your text columns, query with SearchQuery, and get ranked results with stemming and stop-word handling for free:

from django.contrib.postgres.search import SearchVector, SearchQuery

Job.objects.annotate(
    search=SearchVector('title', 'description')
).filter(search=SearchQuery('python developer'))

No Elasticsearch needed. The database handles indexing, ranking, and query parsing. I wrote a full blog post on this: Simple and Efficient Full-Text Search using Django and Postgres

Payments: why webhooks matter

Job posts required payment before going live. The naive approach: user pays → redirect back → activate post. Problem: what if the redirect fails? User paid but post never activates.

The fix: SSLCommerz webhooks. Payment processor calls your endpoint when payment succeeds, regardless of what happens on the frontend. Post activation is decoupled from the user’s browser session.

User pays → SSLCommerz processes → Webhook fires → Post activates

                         (happens server-to-server)

Deployment

EC2 + RDS + Nginx + Gunicorn + SSL. Standard Django production setup on AWS.