Software · Own tool

What a spreadsheetcannot do.

zapply! is a tool for my own job search, built to replace the application spreadsheet. It stores not a status but documents every station with its date, works out the conversion rates itself, and shows in a Sankey diagram where the process breaks off.

Role
Concept, design and engineering
Period
since 2025
Stack
Cloudflare Workers, JavaScript, macOS
Status
Beta, in daily personal use

Problem, solution, outcome

The difference from a spreadsheet comes down to one point: what happens to the previous value when the status changes. Everything else follows from that.

  1. Problem

    A spreadsheet overwrites

    A cell holds one value. After the rejection there is no record that two interviews happened first. The history is not filed away, it is gone.

  2. Solution

    zapply! keeps the history

    Every station stays as its own entry with its own date and can be corrected afterwards. Eleven stations from planned to withdrawn.

  3. Outcome

    The funnel becomes visible

    The analysis falls out of the kept paths by itself: how many applications lead to an interview, how many go further, and at which station they end.

The first two panels show the same three stations. On the left only the last one survives, on the right all three are kept, and only from that can the funnel be worked out.

Four functions

Two of them work out what a spreadsheet only holds between the lines. The other two take work off capturing and finding things again.

  1. 01

    Sankey diagram

    The funnel across every application in one picture. End states branch off where they occurred, so a rejection after a first interview does not land in the same bucket as a rejection straight after sending.

  2. 02

    Documentation

    Eleven stations from planned to withdrawn, each with its own date. Plus channel, salary by amount, type and period, working hours, application deadline and the address of the posting.

  3. 03

    Application statistics

    Conversion per transition, applications by month and location, response time as a median, salary range, channels with their interview rate, and the outcome of every closed process.

  4. 04

    Sorting

    Sort by date, status, company or salary in both directions, search across five fields at once, and status filter chips. The choice is remembered per device.

Why not simply a spreadsheet

Almost every job search starts with a spreadsheet, and for a while it carries the load. Point by point, the comparison looks like this.

  1. Status change

    Spreadsheet

    The cell is overwritten. After the rejection there is no record that two interviews happened first.

    zapply!

    Every station is kept with its own date and can be corrected afterwards.

  2. Analysis

    Spreadsheet

    Count rows, build subtotals, draw a chart by hand. Usually it stops at counting.

    zapply!

    The Sankey diagram, conversion rates, response time, salary range and channels all come out of the data itself.

  3. Capturing

    Spreadsheet

    Type every column by hand. After twenty applications the spellings drift apart and search stops finding anything.

    zapply!

    Suggestions for around 300 employers and 175 locations, channels as icons, salary structured by amount, type and period.

  4. Next step

    Spreadsheet

    Recorded nowhere. Where a follow up is due is something you have to hold in your head.

    zapply!

    A button in the same row: schedule an interview, accept, reject, no answer.

  5. Two devices

    Spreadsheet

    Send the file back and forth and hope the newer version wins.

    zapply!

    An account with sync. On simultaneous edits the interface presents both states and asks which one holds.

  6. On a phone

    Spreadsheet

    Horizontal scrolling through twenty columns.

    zapply!

    Readable from 320 pixels, one card per application instead of one row.

On the left, how most job searches are actually run. On the right, what the tool does at the same point.

The interface

Two tabs carry the tool: the overview for the current state, the statistics for the analysis. Plus a dialog for the history of a single application. There is nothing else, and nothing else is needed.

  1. 01

    Overview

    Function
    Every application in one table, with search across company, role, location, channel and status, status filter chips, and sorting by date, company or salary
    Benefit
    The state of the whole search fits on one screen. The next step for any application is one click in the same row, with no detail view in between.
  2. 02

    History of one application

    Function
    Eleven possible stations from planned to withdrawn, each with its own date, editable at any time
    Benefit
    A late rejection does not erase what came before. That keeps it analysable at which station an application actually ended.
  3. 03

    Application flow

    Function
    A Sankey diagram across all applications, drawn by hand as SVG, with the conversion rate per transition below it
    Benefit
    It shows where the funnel breaks. Being rejected after a first interview is a different problem from never hearing back.
  4. 04

    Analysis

    Function
    Applications by month and location, response time as a median with distribution, salary range, channels with their interview rate, and the outcome of every closed process
    Benefit
    Which channel is worth the effort is answered by a rate rather than an impression. All of it comes out of the histories, with nothing extra to maintain.
Captured from the public demo, which runs on sample data. Four languages including Arabic with right to left layout, light and dark following the system setting, from a 320 pixel phone to a large display without horizontal scrolling.

Decisions meant to last

The tool should still start in five years. These four decisions follow from that.

  1. 01

    One file for the interface

    No framework, no bundler. The app runs as a static file anywhere: locally by double click, inside a WKWebView, behind a Worker. The price is a large file, the gain is durability.

  2. 02

    Password derivation in the browser

    Cloudflare grants ten milliseconds of compute per request on the free tier, too little for proper hashing. So the browser runs PBKDF2 with 400,000 rounds and the server stores only a salted SHA-256 hash of the result.

  3. 03

    Sessions without a database read

    A signed cookie over account id and expiry instead of a session table. No read per request, no delay from eventually consistent storage. The trade is a 30 day lifetime.

  4. 04

    Optimistic concurrency

    Every record carries a revision. The server rejects a write with a stale revision and returns its own state, and the interface presents both. In a tool holding weeks of work, silent overwriting is the worst possible failure.

Status

The tool is in beta and in daily personal use. It is still being developed, so the interface and the data model may still change.

Until 2026 it was called Bewerbungstracker, and the repository still carries that name. The demo runs without sign in on sample data, none of which is stored, and the source is open.