Kadir Terzi
Back to projects

Mobile application and admin panel

KadroBul

An Android app that compares public-sector job postings with a candidate's profile, plus the admin panel I built to publish those postings.

FlutterNext.jsSupabase

Overview

KadroBul is an Android app that compares Turkish public-sector job postings with a candidate's profile. Candidates enter their education, exam scores and other details; the app checks each position's requirements against them and shows which positions are worth reviewing.

Alongside the app I built a separate admin panel for publishing postings: the posting text is pasted in, AI (Gemini) prepares a draft, and I compare it with the source, correct it and publish.

What I built

Three-state matching

Matching works per position. A satisfied requirement gets a green check; a requirement that cannot be checked because the information is missing gets a yellow question mark; a position is filtered out only when the candidate clearly does not meet a requirement. Leaving a field empty never hides a posting. Alternative education options (OR) and separate requirements (AND) are handled separately.

Admin panel and AI draft

A posting is pasted or uploaded as PDF/image and Gemini extracts a draft of the posting and its positions. The draft only contains information found in the source; missing fields stay empty with a warning. Before publishing, a person compares the draft with the source, and the posting and its positions are saved in a single operation.

Architecture

Identity, personal profiles and matching live in Supabase; public posting content is served through a Cloudflare Worker and D1. The mobile app keeps a local cache with Drift (SQLite).

Privacy and accounts

Registration is not required: the app works with an anonymous identity and a Google account can optionally be linked. Personal profile data is never sent to the content delivery layer. Accounts and data can be permanently deleted from the app and from the web; saved postings are stored on the device.

Testing

Matching rules, admin panel validations and mobile screens are covered by automated tests (Flutter tests on mobile, unit tests in the admin panel).

Architecture

Admin panel (Next.js)posting publishingGeminidraft generationSupabaseidentity · profile · postings · matchingCloudflare Worker + D1public posting contentMobile app (Flutter)Drift (SQLite) local cachedraftsave postingcontent syncposting contentidentity, profile,matchingPersonal profiles are never sent hereGeminidraft generationAdmin panel (Next.js)posting publishingSupabaseidentity · profile ·postings · matchingCloudflare Worker+ D1public posting contentMobile app (Flutter)Drift (SQLite) local cachedraftsave postingcontent syncidentity, profile,matchingposting contentPersonal profiles never go to Cloudflare.
Gemini → Admin panel: posting draft Admin panel → Supabase: saving the posting Admin panel → Cloudflare Worker + D1: syncing public content Cloudflare Worker + D1 → Mobile app: posting content Mobile app ⇄ Supabase: identity, profile, matching Personal profiles are never sent to Cloudflare.
  1. Gemini → Admin panel: posting draft
  2. Admin panel → Supabase: saving the posting
  3. Admin panel → Cloudflare Worker + D1: syncing public content
  4. Cloudflare Worker + D1 → Mobile app: posting content
  5. Mobile app ⇄ Supabase: identity, profile, matching
  6. Personal profiles are never sent to Cloudflare.

Technologies

Mobile
  • FlutterThe Android app
  • DartApp language
  • RiverpodState management
  • GoRouterRouting
  • Drift + SQLiteLocal cache
  • Google Sign-InOptional Google account linking
Admin panel
  • Next.jsAdmin panel
  • ReactUI
  • TypeScriptType-safe code
  • Tailwind CSSStyling
  • GeminiPosting draft extraction
Infrastructure
  • SupabaseAuth, personal profiles, posting data, server-side matching, Edge Function
  • PostgreSQLSupabase database and row-level security
  • Cloudflare Workers + D1Public posting content
  • Cloudflare PagesPrivacy and account deletion pages