Let's work together
Back

Making opportunity discovery feel less accidental.

AI-assisted discovery for fragmented academic and career opportunities.

Applied AI · Data Systems · Full-Stack Engineering·Independent project · 2026 · Vietnam·Active development·↗ live website
Python · FastAPI · Next.js · PostgreSQL · pgvector · Docker · GitHub Actions

linkContext

For students, finding a good opportunity is often less about whether it exists and more about whether they happen to see it.

Scholarships, competitions, internships, exchange programs, workshops, and volunteering opportunities are distributed across university websites, social posts, organization pages, PDFs, and application portals. Source formats are inconsistent. Deadlines and eligibility may be buried in prose. The same announcement often appears in several places with slightly different text.

AppLynk exists to transform that fragmented information into structured, searchable records.

linkSystem

The core design principle separates raw source material from published product data. Crawler output enters the system as evidence to be evaluated, not as content ready to serve.

Raw crawler output is evidence. It is not automatically product content.

Sources
Websites · Social posts · PDFs · User submissions
Raw ingestion
Raw records · Source metadata · Timestamps
Processing
Relevance filtering · Duplicate control · Structured extraction · Normalization
Publication boundary
Validated structured records
Application data
Published opportunities · Vector index · User state
Product
Discovery · Search · Ranking · Collections · Bookmarks

linkPipeline

Discover
Collect
Filter
Deduplicate
Extract
Normalize
Publish
Index
Retrieve

Deterministic filtering before inference: TF-IDF relevance screening rejects off-domain documents, and MinHash LSH identifies near-duplicate raw records before any LLM processing. The goal is to avoid spending probabilistic model calls on content that deterministic checks can reject first.

Structured interpretation: LLM workflows recover bounded structured fields such as deadlines, eligibility, and provider details from heterogeneous source text using schema-constrained output. The model interprets source information; it does not become the source of truth. Structured output is normalized before publication.

Hybrid retrieval: 768-dimensional embeddings stored with PostgreSQL and pgvector support semantic retrieval. Semantic similarity handles conceptual meaning; SQL structured fields enforce explicit constraints such as deadline, category, and eligibility. Both paths are complementary, not interchangeable.

linkProduct

AppLynk delivers a live discovery experience for Vietnamese students and young professionals, with bilingual Vietnamese and English interfaces.

CapabilitySystem underneath
Opportunity discoveryStructured published records surfaced through ranking logic
Natural language searchVector retrieval (768-d pgvector embeddings) combined with structured SQL filters
PersonalizationProfile signals and ranking adjustments based on user context
School directoryServer-side autocomplete across 3,185 Vietnamese high schools and universities

linkReliability

Seven asynchronous workers coordinate ingestion without external queue dependencies. Worker roles include: scrape, extract, publish, translate, classify, index, and reaper.

Scheduled crawlers
Six-hour ingestion cycles via GitHub Actions
PostgreSQL task coordination
Atomic state transitions · transactional ownership · worker leases · heartbeats
Scrape → Extract → Publish
Translate · Classify · Index
↳ Stale Reaper recovers abandoned leases

Failure recovery: If a worker fails after claiming a task, its lease eventually becomes stale. The Reaper releases the abandoned ownership so another worker can safely reclaim the task.

linkDecisions

DecisionWhyTrade-off
Filter before inferenceAvoid sending obvious noise and near-duplicate content through model processing because deterministic checks are cheaper and sufficient for a first passAdds a preprocessing stage; mis-calibrated thresholds could incorrectly reject valid content
PostgreSQL-backed task coordinationTask state and transactional ownership stay close to application data without introducing another stateful infrastructure componentA dedicated message broker may become more appropriate at materially larger scale or throughput
Separate raw and published dataPreserve provenance and keep unverified crawler output away from users; makes the publication decision an explicit stepRequires managing a two-stage data lifecycle rather than publishing records directly on ingest
Semantic + structured retrievalSemantic similarity handles conceptual meaning and intent; structured fields enforce explicit constraints that vector distance cannot reliably expressRequires maintaining two complementary retrieval paths with separate indexing concerns

linkOwnership

Independent end-to-end build covering product interface, full-stack application, ingestion architecture, structured extraction, database design, semantic retrieval, worker coordination, and deployment automation.

The project is fundamentally about deciding where uncertainty belongs in a system and building the surrounding infrastructure to make that boundary dependable.

linkStatus

Live product: https://applynk.haidangtrih.me/en

Active development focused on expanding sources, improving ranking, and refining retrieval quality.