Skip to content

Case study · 2026

Sans Suite

A local application built to track my job applications, organize the next steps, and find their history without relying on a spreadsheet that had become difficult to read.

Overview of the Sans Suite application.

Project resources

The application's source code and the instructions needed to install it are available on GitHub.

Introduction

I started Sans Suite from a simple personal need. I was tracking my job applications in an Excel file that gradually accumulated more rows and columns.

The spreadsheet was enough to record a company, a position, and a date. It became much less practical when I wanted to keep a job description, several exchanges, personal notes, or the next actions I needed to take.

I wanted a tool designed around this workflow, with a clear timeline but without making data entry heavier. The French name “Sans Suite” refers to applications that sometimes receive no follow-up.

From a spreadsheet to structured tracking

A job application has its own history. It can start with a job listing or a direct application, then continue with a follow-up, a call, an interview, an offer, or a rejection several weeks later.

In Excel, this information ended up in one long cell or spread across several columns. Sans Suite gives each application its own page, bringing its status, history, and next actions together.

Keeping application entry quick

My first goal was to make adding an application quick. During a job search, keeping a tracker up to date can quickly feel like another chore. If every entry had required a long form, I would probably have started putting it off.

I therefore made only four fields mandatory: the company name, its address or city, the position, and the application date. The date defaults to today, removing one more step in most cases.

Company name
Address or city
Position
Prefilled date

Everything else is optional: the job board and listing URL, the full job description, the cover letter I sent, personal notes, and attachments. These details can be entered straight away or added later. This keeps the initial entry short while still giving me somewhere to keep the information I may need afterwards.

Organizing the follow-up

Once an application has been created, its page brings replies, calls, follow-ups, interviews, and notes together. An action can also be scheduled, found in the calendar, and marked as completed.

The application list only shows the information needed to identify each entry: company, position, status, location, and date. Search also covers notes and job descriptions, while filters narrow the results as the list grows.

On mobile, the calendar becomes a chronological list that is easier to scan. Applications can also be exported as CSV so the data remains accessible outside the application.

Improving the interface

The first versions of the overview displayed more information. After using the application, I narrowed it down to active applications, those awaiting a reply, rejections, and upcoming tasks. These are the figures I need to understand the current state of my search quickly.

I had also separated past events and future actions into two calendars. This meant switching between them to follow an application. I combined them into one view: upcoming tasks appear first, while completed actions remain available in the history.

Choices shaped by the context

A job search can already be stressful. I did not want daily goals, guilt-driven statistics, or artificial motivational messages. The interface remains restrained, and additional information only appears when it becomes useful.

No artificial targets

The application sets no daily targets and does not turn a job search into a performance dashboard. Secondary actions remain discreet until they are needed.

Local data

Applications and documents remain on the machine. No remote account or additional service is required to use the application.

Technical implementation

Sans Suite uses CorianderPHP, my PHP framework. This project let me use it for a complete application beyond its documentation and check whether its design choices still worked for a concrete need.

Read the CorianderPHP framework case study

Architecture

Controllers handle HTTP requests, services contain the business logic, repositories manage SQLite access, and views handle presentation.

Interface

TypeScript handles browser interactions, while Tailwind CSS makes the interface easier to evolve without losing visual consistency.

Data security

Mutations are protected against CSRF requests, output is escaped, and attachments are stored outside the public directory.

Tests

The automated suite covers the main business behavior: search, statuses, notes, events, archiving, scheduled tasks, and CSV export.

The main challenge

The main challenge was to let the application grow without losing the simplicity that led me to build it. It would have been easy to add more fields, statistics, and views, but every extra option makes data entry longer and the tool harder to maintain.

Every addition therefore had to address a need I had encountered while using the application, without making data entry unnecessarily longer or complicating the existing workflows.

What I learned

Sans Suite taught me how to start from a concrete problem and build an application around the way I actually work. Moving from an Excel file to structured data required me to separate an application, its current state, the events in its history, and the actions that still need to happen.

The project also gave me a concrete way to test CorianderPHP, organize a complete architecture, and cover business rules with automated tests. Most importantly, it confirmed that a tracking tool only remains useful when it is quick enough to keep up to date and clear enough to recover the context of an application several weeks later.