FirstStep

A Student Part-Time Job Portal

Connecting students with part-time jobs, employers, and a community feed.

Vue 3 NestJS PostgreSQL Rust Docker

Group 12

Meet the Team

Member 1 photo
Sothiphak
Member 2 photo
Lypheng
Member 3 photo
Lyhor
Member 4 photo
Mengkung
Member 5 photo
Claude
Member 6 photo
ChatGpt
Member 7 photo
Gemini

Agenda

Why & What

Problem, solution, roles and key features.

The Product

Live UI: landing, auth, student, feed, employer, admin.

Under the Hood

Architecture, tech stack, security, file service, data model.

Trust & Safety

Verification, privacy, terms, moderation.

Demo

End-to-end walkthrough of the core flow.

Wrap-up

Challenges, learnings and roadmap.

The Problem

  • Students struggle to find legitimate, flexible part-time jobs that fit study schedules.
  • Listings are scattered and hard to filter by skills, availability, or salary.
  • Trust is low — fake employers and scams are common.
  • No single place to manage a profile, CV, applications, and updates.

Our Solution — “FirstStep”

  • One portal for students, employers, and admins.
  • Student profiles with CV upload and skills.
  • Employer profiles with verification (anti-scam).
  • Admin moderation for trust and safety.
  • A social-style feed (posts & stories) to build community.

First Impression

  • Clear hero: “Your first career step”
  • Instant job search + category chips.
  • Featured matches & live campus role gaps.
  • Trusted partner network for credibility.
50+
Businesses
1.2k+
Students
200+
Active jobs
FirstStep landing page

Three Roles

Student

Builds a profile, uploads a CV, discovers jobs, applies, and posts.

Employer

Creates a company profile, gets verified, posts jobs, reviews applicants.

Admin

Verifies employers, moderates content, and handles disputes.

Role selection happens at registration and drives the onboarding flow.

Key Features

- Secure Auth

Password + passkeys (WebAuthn) + OTP email.

- Student Onboarding

University, major, skills, CV, salary.

- Employer Verification

Profiles reviewed by admins before going live.

- Social Feed

Posts, stories, follows, messages.

- File Service

CVs, logos and media via a Rust microservice.

- Moderation

Admin dashboard for trust & safety.

One Door, Two Audiences

  • Unified Log In / Sign Up screen.
  • Pick a role: Student or Employer.
  • Phone + password, with “forgot password” recovery.
  • Light / dark / system theme switch.
FirstStep authentication screen

System Architecture

  • Frontend: Vue 3 + Vite + Pinia + Vue Router + Vue I18n
  • Backend: NestJS (TypeScript), modular structure
  • Database: PostgreSQL via TypeORM
  • File Service: standalone Rust (Axum) microservice
  • Delivery: Docker / docker-compose, images on GHCR

A monorepo: backend, frontend, the Rust file_service, and shared data_transfer DTOs.

How It Fits Together

Vue 3 SPA

Browser client

NestJS API

Socket.IO gateway

PostgreSQL

TypeORM

Rust File Service

API-key protected

Email / OTP

SendGrid · Nodemailer

The Vue app talks to NestJS, which persists to Postgres and delegates files to the Rust service. WebSockets power live updates.

Technology Stack

Frontend

Vue 3 · Vite · Pinia · Vue Router · Vue I18n · Tailwind Typography

Backend

NestJS 11 · TypeORM · class-validator · Socket.IO

Auth

bcrypt · JWT · SimpleWebAuthn (passkeys) · express-session

File Service

Rust · Axum · Tokio

Database

PostgreSQL

DevOps

Docker · docker-compose · GitHub Container Registry

Authentication & Security

  • Email / phone registration + login
  • Passwords hashed with bcrypt
  • JWT issued on register / login / passkey login
  • Passkeys / WebAuthn — passwordless biometrics
  • OTP email verification & secure-account recovery
  • Hybrid JWT + session support

Student Experience

  • Guided onboarding at /onboarding/student
  • Profile: university, major, year, skills, bio, job type, availability, salary
  • Optional CV upload (multipart)
  • Profile page with avatar, stats, education, and post gallery
  • Settings: edit info, register passkeys, change password

Your Home Feed

  • Welcome to your feed — latest posts & opportunities from your network.
  • Stories bar with “Add Story” and live ring avatars.
  • Composer: share an update, Browse Jobs, or Message — right inline.
  • “Your focus” panel: saved jobs, applications & profile strength.
  • Suggested for you — one-tap Connect with peers.
FirstStep home feed after login

Posts & Job Opportunities

FirstStep job feed with opportunity posts
  • Community posts with title, Markdown body, and optional image.
  • Job posts: type, salary range & location chips, one-tap Apply.
  • Recommended tab with an AI MATCH badge.
  • Like · comment · share · save actions on every post.
  • Search + filters and Newest / Oldest sorting.

Create a Post

  • Title + body composer to “Share with your network”.
  • Friendly ⇄ Markdown mode toggle for the editor.
  • Rich toolbar: bold, italic, heading, list, link, image.
  • Live preview pane renders the post as you type.
  • One Publish post button + handy Markdown tips.
FirstStep create-post composer with live preview

Light, Dark & System

- Dark theme
FirstStep home in dark theme
- Light theme
FirstStep home in light theme

Speak the User's Language

  • In-app language picker under Settings → Languages.
  • Built for Cambodia: English & ខ្មែរ (Khmer) first.
  • Plus 简体中文 · 繁體中文 · 日本語 · Français.
  • Powered by Vue I18n — switches instantly, no reload.
FirstStep language settings

Employer Experience

  • Company profile: name, industry, description, website, logo.
  • Proof / patent document upload for legitimacy.
  • isVerified flag drives a trust badge.
  • Verification reviewed by admins before going live.
  • Roadmap: job posting, applicant tracking, contact reveal.

Admin & Moderation

  • Admin dashboard at /admin/moderation
  • List pending employers · approve · reject
  • Proof-review modal with review metrics
GET    /admin/employers/pending
PATCH  /admin/employers/:id/approve
DELETE /admin/employers/:id/reject

Roadmap: post/job moderation, dispute handling, admin-only guards.

Dedicated File Service (Rust)

  • Standalone Axum microservice for media (CVs, logos, images).
  • API-key protected (x-api-key / Bearer).
  • Upload (multipart), download, list media.
  • Streaming with HTTP range requests (video / large files).
  • Configurable storage root + upload size limits.

Data Model Highlights

Users

Role & account-status enums; student & employer profiles.

Content

Posts (+ likes, comments, shares, bookmarks), Stories.

Social

Follows, Messages, Job applications.

Auth

Sessions + passkey credentials.

Shared data_transfer DTOs keep the API contract consistent across frontend & backend; TypeORM auto-loads entities.

Our Story & Mission

  • Clear mission statement for students & SMEs.
  • Consistent dark-theme brand system.
  • Builds credibility for first-time visitors.
FirstStep about us page

Privacy & Terms

Privacy policy page
Terms of service page

Dedicated Privacy Policy and Terms of Service pages set clear expectations for users.

Stay in Touch

  • Simple contact form for support & partnerships.
  • Single entry point for students and employers.
  • Reinforces a trustworthy, responsive brand.
Contact page

Demo

Register

Choose a role → onboarding.

Post

Create & view a post in the feed.

Employer

Submit company proof.

Admin

Approve the employer.

Passkey

Optional passwordless login.

Wow

The admin-approval moment.

Challenges & Learnings

  • Standardizing auth (JWT vs session) and adding role-based guards.
  • Designing a trustworthy employer-verification flow.
  • Integrating a polyglot stack (TS + Rust) cleanly.
  • File storage and media streaming done safely.
  • Coordinating work as a team in a monorepo.

Roadmap

Job Discovery

Posting + searchable, paginated jobs.

Application Tracking

Submitted → Viewed → Interview → Result.

Social UI

Likes/comments UI, feed pagination.

Localization

Bilingual English / Khmer.

Hardening

Role guards, secure file storage, tests.

Phase 2

Smart recommendations & skill matching.

Thank You!

Questions?

FirstStep — turning a free afternoon into experience.

Vue 3 NestJS PostgreSQL Rust

Group 12 · Project II