redXtrm
AI Agent SystemsBusiness AutomationRAG ChatbotsVoice + WhatsApp AgentsCustom AI WorkflowsCustom Web AppsE-Commerce PlatformsAPI + Backend BuildsDatabase ArchitecturePerformance OptimizationAI Agent SystemsBusiness AutomationRAG ChatbotsVoice + WhatsApp AgentsCustom AI WorkflowsCustom Web AppsE-Commerce PlatformsAPI + Backend BuildsDatabase ArchitecturePerformance Optimization
PortfolioPre-launch · jobxlaw.com
Case study — jobXlaw

One AI chat, two BD needslabour law cited like statute · a job hunt centred on BD talent

jobXlaw is a bilingual (English / Bangla) chat over the Bangladesh Labour Act 2006 and its amendments, paired with an AI-ranked job market and a tailored CV / cover-letter studio. Web today; Telegram, WhatsApp and Discord — agentic — on deck.

jobXlaw homepage hero — Find Work Past Borders Cited Like Statute, with stats for sections indexed and CV templates.
354+
Statute sections indexed
30+
CV + cover-letter templates
8
Job ingest pipelines
EN · BN
Chat languages
Visual proof

Image gallery

9 product screenshots

A closer look at the active jobXlaw surfaces: the public homepage, job portal, labour-law chat, CV studio, and member dashboard.

The problem

Why this is harder than chat

Most BD workers, HR managers and SMEs have no affordable way to ask “is this legal?” or “what does the Act say about X?” — and no clean way to produce a professional CV / cover letter in either language. The corpus is statute, not blog posts: every claim has to cite a section, every section comes with sub-sections, amendments and sectoral carve-outs.

Citations, not vibes

A labour-law answer that doesn’t point to a section, sub-section or amendment is worse than no answer — it’s a liability. Every reply has to cite the exact provision it pulled from.

Statute structure is not a PDF

The Bangladesh Labour Act 2006 is parts → chapters → sections → sub-sections → clauses, with amendments stacked on top. Naïve page-chunk RAG flattens that hierarchy and citations rot.

Bilingual on both ends

A worker asks in Bangla; the gazette is partially English; the amendment text mixes scripts. The retriever has to span both languages — and the answer has to come back in whichever the user used.

Sensitive surface area

Termination, wages, maternity, gratuity, retrenchment, provident fund — the queries that drive traffic are the same queries where a hallucination causes real harm. Confidence has to be earned, not asserted.

Feature 01 · ChatStatute-cited

Labour-law chat that reads like a statute, talks like a colleague.

Ask in English or Bangla. Get a structured answer with scope, current operative language, amendments, and a References footer pointing back to the exact section. Follow-ups, summarise, translate, copy, share — all in one message panel.

  • Section / sub-section / amendment indexing — citations survive re-ranking.
  • “References” chip on every answer links to the cited Act provision.
  • You-might-also-ask suggestions generated from the retrieved context.
  • Per-message actions: summarise, translate, vote, bookmark, copy, share, email.
  • File panel: drop a termination notice or appointment letter and ask about it inline.
jobxlaw.com/chat
jobXlaw chat answering “Explain Section 120 from Bangladesh Labour Act, 2006” with scope, operative language, amendments and a References footer.
Feature 02 · JobsAI · best-fit

A job market that ranks against your profile, not against the algorithm.

Aggregated postings from BD and global sources — BDJobs, LinkedIn-BD, Adzuna, Ashby, Greenhouse, Lever, Workable, RemoteOK, We Work Remotely, plus user-submitted roles. The “For you” feed scores every role against the candidate’s professional profile and emails subscribers when fresh matches land.

  • 8 ingest workers running on cron, normalised into one schema.
  • “For you” ranking from skills, seniority, location preferences, language.
  • Subscriber emails — opt-in, only when a match crosses the score threshold.
  • Paste-link flow: drop any job URL, get it parsed and added to your shortlist.
  • One click on a posting opens the tailored CV + cover-letter flow for that role.
jobxlaw.com/jobs
jobXlaw job market with BD and global postings, filters, “For you” ranking and source tags (BDJobs, LinkedIn-BD, user-submitted).
Feature 03 · CV studioJD-aware

A tailored CV and cover letter for the role on the screen.

Click a posting → the studio opens with the role and company pre-filled. Choose a template (Classic, Corporate, Creative, Tech, Academic), pick an accent colour, walk the 4-step wizard — Template → Tailor → Preview → Save — and ship a PDF. Cover letters use the same context.

  • Template gallery grouped by tone — Terminal, Blueprint, Stack, Scholar, Thesis…
  • Accent picker + free-form hex, mapped through every template consistently.
  • 4-step flow: Template → Tailor → Preview → Save. Resume editing later.
  • JD-aware tailoring: pulls the role description into the rewrite layer.
  • Server-side PDF export, version history, shareable preview links.
jobxlaw.com/cv-studio
jobXlaw CV studio with Senior Data Analyst preset, template gallery (Terminal, Blueprint, Stack, Scholar, Thesis), accent colour picker and 4-step wizard.

Challenges & overcomes

6 hard parts

Section-aware chunking

Problem

Raw page chunks shred the hierarchy — a sub-clause loses its parent section and the citation breaks.

Fix

Custom ingester walks the Act tree (parts → chapters → sections → sub-sections), stores hierarchy alongside the vector, and re-attaches the canonical citation at retrieval time.

Bilingual retrieval

Problem

Bangla queries against an EN+BN mixed corpus consistently under-recalled relevant amendments.

Fix

BGE-M3 multilingual embeddings + a per-chunk language tag. Query in Bangla, retrieve across both, answer in the language the user used.

No-citation = no-answer

Problem

Models will gladly answer without grounding. On a labour-law surface that’s how you ship harm.

Fix

Hard gate in the prompt + response schema: if the retrieved context cannot support a claim, the answer says so. Every claim renders with the cited section in a References footer.

Content-gap curator loop

Problem

Real questions out-paced the indexed corpus — leave entitlements, recent amendments, niche sectors.

Fix

Every low-confidence or unresolved answer becomes a curation ticket in the admin console. Curators add the source; the next ingest pass closes the gap.

Eight job feeds, one schema

Problem

BDJobs HTML, LinkedIn-BD RSS, Adzuna JSON, Greenhouse / Lever / Ashby / Workable APIs, RemoteOK / WWR — every shape different, every cadence different.

Fix

A shared normaliser + per-source workers under `ingest/`, with cron coordination and a single Postgres schema. New source = new worker, same downstream.

Personal-relevance email

Problem

A daily job blast is noise. People unsubscribe by week two.

Fix

Match score (skills × seniority × location × language) gates the email. Only roles above the threshold ship — most subscribers get 0–3 emails a week, but every one is on point.

Same brain, every phone

Multi-channel roadmap

The chat, jobs and CV pipelines are exposed as one service. The web app is just the first surface. Telegram and WhatsApp wrap the same endpoints; the Discord build adds agentic actions — slash commands that book screenings, post to channels, and watch queries for new matches.

Web

Live build

jobxlaw.com — chat, jobs, CV studio, blog, resources, account, billing.

Telegram

Bot endpoint drafted

Same brain at `/api/telegram`. Text + file in, answer + PDF out. History syncs to the web account.

WhatsApp

Cloud API · personal number

Personal-number tier via WhatsApp Cloud API while pre-launch. Group + DM support. Upload a JD, get a tailored CV back as a PDF inside the thread. Verified-business upgrade waits until volume justifies it.

Discord (agentic, soon)

Designing

Slash commands for chat / jobs / tailor. Agentic mode — book a screening, post to a server channel, watch a query for new matches.

Agentic actions on Discord — coming soon

Stack

Production
Frontend
Next.js (App Router)
UI
Tailwind + shadcn/ui
Realtime data
Convex
Platform
Supabase (auth + DB + storage)
ORM
Drizzle ORM
Retrieval
pgvector + BGE-M3
Inference
RedClaw routing (API + subs)
Documents
Server-side PDF
Background
Email worker + cron
Channel
Telegram Bot API
Channel
WhatsApp Cloud (personal)
Edge
Cloudflare (DNS · WAF · CDN)
Inbound mail
Cloudflare Email Routing
Transactional mail
AWS SES
Background workers
AWS EC2 — agents + cron
Deploy
Coolify on Lightsail

How this stays profitable

Cost notes

A bilingual labour-law RAG with multi-channel surfaces could burn money fast on the wrong infra. Every line below is a margin choice — what isn't here (managed PaaS, retail SMTP, per-invocation serverless on background work) is on purpose.

Lightsail + Coolify

Flat monthly host. Coolify ships Docker without managed-PaaS pricing — same delivery surface as Vercel, none of the per-invocation cliff.

Cloudflare for the front door

DNS, WAF and CDN at near-zero marginal cost. Bot traffic is filtered before it ever hits origin, so the host plan stays predictable as traffic scales.

AWS SES for outbound, Cloudflare for inbound

SES sends transactional mail at $0.10 / 1k — an order of magnitude under retail providers. Cloudflare Email Routing terminates inbound mail and fans it into the worker without a paid mailbox.

EC2 for 24/7 agents + cron

Long-running agentic workers and scheduled jobs live on a single EC2 host, off the request path. No serverless cold-starts, no per-invocation bill for background work.

Hybrid inference routing

Light, latency-sensitive calls go direct to pay-per-use APIs. Heavy scoped tasks (curation, evals, batch CV generation) route through RedClaw subscription seats. Margin lives in the routing layer.

WhatsApp Cloud (personal) until it earns the upgrade

Pre-launch volume runs on the free Cloud API personal tier. Verified-business + WABA only when conversation volume actually justifies the verification + per-conversation cost.

Need a bilingual RAG product?

Domain corpus, multi-channel, citations, curator workflow, best-fit ranking — every piece on jobXlaw is reusable on a new corpus and a new language pair.