Skip to content

Repository files navigation

Freelance Market Intelligence

Analytics dashboard for French tech freelance offers. Collecting contractor job postings daily from free-work.com since March 2022, with market insights on rates, trends, top technologies, and hiring companies.

freelance.shellbear.me

Dashboard Preview

Terminal Mode

Bloomberg Terminal-style interface.

Terminal Mode Preview

Features

  • KPI dashboard — total offers, average/median daily rates (TJM), period-over-period trends
  • Interactive charts — offer volume over time, rate evolution, rate distribution histogram, top technologies
  • Company rankings — top hiring companies with average rate ranges
  • Best offers — highest-paying offers with pagination
  • Filtering — search by keyword and filter by time period (7d, 30d, 90d, 1y, all)
  • Terminal mode — Bloomberg-style dark terminal at /terminal with derived metrics, keyboard shortcuts, and simulated CLI
  • Daily data collection — automated cron job fetches new offers every day at 08:00 UTC

Tech Stack

  • Framework: Next.js 15 (App Router)
  • Language: TypeScript 5.9
  • UI: Tailwind CSS 4, shadcn/ui components, Recharts
  • Database: PostgreSQL with Prisma 6
  • Deployment: Vercel (with cron support)

Prerequisites

  • Node.js 20+
  • pnpm
  • A PostgreSQL database

Getting Started

  1. Install dependencies

    pnpm install
  2. Configure environment variables

    Copy .env to .env.local and fill in your database connection string:

    DATABASE_URL="postgresql://user:password@host:5432/dbname"
    
  3. Set up the database

    pnpm prisma migrate dev
  4. Start the dev server

    pnpm dev

    Open http://localhost:3000.

  5. Seed initial data (optional)

    Trigger the cron endpoint once to fetch the latest offers:

    curl http://localhost:3000/api/cron

API Endpoints

EndpointDescription
GET /api/statsGlobal KPIs (totals, averages, medians, trends)
GET /api/offersOffer volume and average rates grouped by day
GET /api/best-offersTop offers sorted by highest rate (paginated)
GET /api/technologiesTop job categories by offer count and avg rate
GET /api/companiesTop companies by offer count and avg rate
GET /api/rate-distributionDaily rate distribution in 100EUR buckets
GET /api/cronFetches new offers from free-work.com

All endpoints (except /api/cron) accept ?search= and ?period= query params.

Project Structure

app/
layout.tsx Root layout (fonts, metadata, analytics)
page.tsx Main dashboard page
terminal/ Bloomberg terminal mode
api/ Route Handlers
components/
ui/ Reusable UI primitives (Card, Table, Badge, etc.)
dashboard/ Dashboard-specific components (charts, filters, tables)
terminal/ Terminal mode components (13 files)
lib/
prisma.ts Prisma client singleton
queries.ts Shared query helpers
types.ts Shared TypeScript interfaces
utils.ts Utility functions (cn, periodToDate)
prisma/
schema.prisma Database schema
styles/
globals.css Tailwind v4 theme and global styles
terminal.css Terminal mode theme and animations

Deployment

The project is configured for Vercel. The vercel.json file defines a daily cron job at 08:00 UTC that calls /api/cron to ingest new offers.

License

Private project.

About

⚡️ View french market freelance offers and trends since 2022

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages