All work

01 — Case study

JobSpace

A spreadsheet for your job hunt, with a real backend.

My part
I designed and built all of it, front end to deploy
Year
2026
Status
Live
The JobSpace landing page with the spreadsheet-style applications table

The problem

Most people track applications in a Google Sheet, and by the fiftieth row it is a mess. Resumes live in one folder, company notes in another, and nobody can tell which stage is holding them up.

JobSpace keeps the sheet and puts the rest around it: login, a document vault, company notes and charts, all in one workspace.

What it does

  • Your own columns

    Every application has the usual fields plus any column you add. No schema change, no migration.

  • Document vault

    Attach resumes and cover letters. Uploads are capped at 10 MB and limited to PDFs, documents and images.

  • Company notes

    The same flexible columns for the companies you are watching, not just the jobs you applied to.

  • Charts of your pipeline

    Built with Chart.js from your own application data.

  • Login with real sessions

    Normal users and admins use separate routes with their own guards.

How it works

The React app calls an Express API with credentials. The API reads a session cookie, checks it against sessions stored in MongoDB, runs the route guard and then talks to MongoDB through Mongoose.

  1. 01React appReact Router · Axios · Chart.js
  2. 02Express APISessions · route guards · uploads
  3. 03MongoDBusers · applications · companies · documents · sessions

Engineering decisions

  1. 01

    Cookie sessions, not JWTs

    Sessions live in MongoDB, so logging out genuinely ends the session on the server. With a JWT I would have been waiting for it to expire.

  2. 02

    A schema that bends where users need it to

    Common fields are real fields. Anything a user adds goes into an open extension map, so new columns cost nothing.

  3. 03

    Uploads are checked before they reach any code

    File type and size are enforced in middleware, and passwords are hashed with bcrypt.

  4. 04

    Two services, deployed separately

    The front end and the API ship independently, so I can change one without touching the other.

Stack

  • React 18
  • Vite
  • React Router
  • Chart.js
  • Node.js
  • Express 5
  • MongoDB
  • Mongoose
  • connect-mongo
  • bcrypt
  • Multer

Worth knowing

The API runs on a free hosting tier, so the first visit after a quiet spell can take a few seconds to wake up.