GuardLink app icon

Marketplace platform

Web platform & native mobile client

Find your next shift,
and the licence to get it.

Most job boards bury the details a security guard actually needs. GuardLink puts pay, hours, shift, location and the required licence on the listing itself. When a job asks for a credential you do not hold, it shows you where to go and get it.

StatusBuilt. Not yet publicly launched
SidesGuards, employers and training providers
CoverageNYC, Long Island and Westchester
ClientsNext.js web app plus a native Expo client
The GuardLink job board, showing filters for pay, job type, shift and licence alongside structured job listings

Every listing carries the pay, the weekly hours, the shift pattern, the location and the exact licences required. Listings shown here are sample data and labelled as such in the product.

The problem

The information that decides the job
is the information nobody publishes.

Security work is governed by credentials. An NYS Guard licence, an F-01, an F-60, FLSD, armed certification. Whether you can take a job comes down to which of those you hold, and most postings never say. So guards apply blind, employers filter out most of what arrives, and both sides waste the week.

The information is also scattered. Opportunities live across generic boards, agency sites and group chats, in formats that cannot be compared.

The idea

Make the credential
a first class part of the listing.

Structure the job properly, then let people filter on the things that actually decide the outcome: pay floor, shift, borough, job type and licence. When a credential is missing, do not just reject the guard. Show them the course that closes the gap.

That third step is what turns a two sided board into a three sided marketplace, and it is why training providers belong in the product.

Three sides

One platform, three jobs to do.

Guards

Find work you can actually take

  • Search and filter by pay, shift, borough and licence
  • See exactly what a job requires and what you are missing
  • Save jobs and set alerts
  • Profile, applications and dashboard
  • Find the training that closes the gap
Employers

Post a role that gets the right people

  • Claim a company profile
  • Post a structured job, not a paragraph
  • Quality feedback before the post goes live
  • Receive and manage applicants
Trainers

Be found by people who need you

  • Claim a training provider listing
  • Publish courses, prices and class dates
  • Reach guards at the exact moment of need
  • Listed separately from the courses themselves

The product

Web and native, one source of truth.

A GuardLink job detail page
Job detailRequirements, provenance and freshness on the page
The GuardLink native app job list
The GuardLink native app job detail screen

The engineering

A modular monolith,
layered strictly.

The interesting decision here is not the framework. It is the discipline: pure domain logic that can be imported and tested without Next.js, and client components that can never reach the database.

PresentationApp routes and components. No database access from a client component, ever
calls
ApplicationServer actions and route handlers, the only place a request becomes a mutation
calls
DomainScoring, matching and classification as pure functions. Importable and testable with no framework in the room
calls
PersistenceRepositories over Drizzle ORM and SQLite, with an eighteen table schema
Mobile

A client, not a second implementation

The native app contains no database, no duplicated business rules and no second matching algorithm. The web platform stays the source of truth for search, scoring, applications and freshness. The app renders that and posts back to it.

Auth

One session system, not two

Native clients cannot safely use cookie auth, so bearer tokens were added. The token is a session id from the same sessions table, which means expiry, revocation and the suspended account check all apply unchanged.

Honesty

Provenance on every listing

Jobs carry where they came from and when they were last verified, and sample data is labelled as sample data inside the product. A stale listing is worse than no listing when someone is planning their week around it.

The stack

What it is made of.

Web
  • Next.js
  • TypeScript
  • Server actions
  • React
Data
  • Drizzle ORM
  • SQLite
  • Eighteen table schema
  • Migrations and seeds
Mobile
  • Expo and Expo Router
  • React Native
  • Secure Store
  • Bearer token auth
Operations
  • Docker
  • Fly.io configuration
  • Ingestion scripts
  • Typecheck and test gate

Next project

WedLink

View case study

Marketplaces, portals and platforms.

If your industry runs on information nobody has organised yet, that is a product.