AtheerJobs

Project overview · September 2026

AtheerJobs

A private workspace for a job hunt. A small team researches companies, reaches the right person, applies with a standard CV and follows up, and everyone can see who did what.

5steps from the first contact to the follow-up
10statuses, with fixed rules for moving between them
6parts of the workspace that export and import as CSV or JSON
464automated tests passing on every push
The company board: fit and filters on top, the list on the left, the selected company with its apply wizard on the right.

Purpose

Why it exists

Applying to companies directly takes more than sending a CV. Each company needs research, the right person to talk to, a call, an email, the application itself and a follow-up. A spreadsheet can hold that list, and for one person it is often enough.

It stops working as soon as a team shares the list. Statuses live in someone's copy, every script carries one person's name and signature, and nobody can see that a company was already called the day before.

AtheerJobs gives a small team one place to run that outreach every day: one shared list of companies, a clear next step for each person, and a record of every call and email.

One shared source

Companies, contacts, research and templates are kept once for the whole team, instead of in copies of a spreadsheet.

A clear next step

Every company follows the same five steps, and the app suggests where each person stands and what to do next.

Personal messages

Scripts and emails are written once and filled with the details of whoever uses them: name, phone, email, portfolio and signature.

Team awareness

The dashboard and each person's pipeline show who contacted and applied where, so nobody calls the same company twice by accident.

Private by design

Sign-in only, accounts created by an administrator, CVs on a private disk, and real company data never stored in the code repository.

Anywhere

The same app on a laptop or a phone, in light or dark mode, with import and export so the data can move with the team.

Approach

How it was built

The work moved in five stages, from the workflow to a tested product.

  1. Map the workflow

    Follow the outreach as it really happens: research a company, find the right person, call, email, apply and follow up. A one-page prototype tested the flow before the app was built.

  2. Model the work

    Separate what the team shares (companies, contacts, templates) from what belongs to each person: one application per company, with a status, dates, notes and a timeline.

  3. Build in layers

    Start from the Laravel and React starter kit and keep a strict structure. Requests validate, actions write, services read, and resources shape what each page receives.

  4. Keep real data out of the code

    Companies and contacts are imported from a file that never enters the repository. Tests, demos and these screenshots use a fictional team and made-up companies instead.

  5. Test, document, repeat

    Each change ships with tests, updated guides and fresh screenshots. CI checks every push, and the whole suite also runs against MySQL, the production database.

Five steps per company

Every application climbs the same staircase. Any step can be opened at any time; the app suggests the one you are on and logs each action on your timeline.

  1. Step 1

    Contact

    Pick the person to reach, from the research or a new contact.

  2. Step 2

    Call

    Follow the script and log the outcome: no answer, talked, or a wrong number.

  3. Step 3

    Email

    Send the personal email and mark it as sent.

  4. Step 4

    Apply

    Apply with your standard CV. A follow-up is planned for a week later.

  5. Step 5

    Follow up

    Record replies, interviews and offers, and plan the next step with a date.

A status pipeline with rules

Ten statuses describe where an application stands. Changes follow fixed transitions, so an application cannot jump from Not contacted to Offer, and every change is written to the timeline.

Not contacted Called, no answer Talked on phone Email sent Applied Replied Interview Offer
Rejected Not interested can close an application at almost any point. Both can be reopened.

Written once, personal for everyone

Templates are stored with placeholders. When someone opens one, the app fills in their details and the contact they chose, and adds their signature to emails. Missing details are pointed out, with a link to the profile.

Stored template (English email)

Hello team,

I am [Name], and I would love to join you.
My portfolio: [Portfolio].

Best regards,

What Sara sees, with Maya Chen chosen as the contact

Hi Maya,

I am Sara Malik, and I would love to join you.
My portfolio: https://saramalik.example.

Best regards,
Sara Malik
Frontend Developer · React & TypeScript

The app

A tour in screenshots

Taken from the demo workspace: a fictional team, made-up companies on .example domains and 555 phone numbers. Select a screenshot to see the whole page.

Signing in

There are no public pages and no sign-up form. An administrator creates each account, and people sign in with their email and password or with a passkey. Two-factor authentication is available in Settings.

The team dashboard

The first page after signing in shows the whole team at once.

  • Totals: companies, contacted, applied, interviews, and high-fit companies nobody has touched yet.
  • Each teammate's progress, and a live feed of every call, email, note and status change.
  • Your own next actions, with overdue and due-today ones flagged, and suggestions on where to begin.

The company board

Every company sits on one board. The bar on top splits them by how well they fit, and filters narrow the list by fit, district, status, named contacts or dead websites.

Search ignores case, accents and Turkish letters, so ozturk also finds ÖZTÜRK. The same list works as a sortable table, where each person changes their status inline.

One company, step by step

A company page shows your status, your contact person, the suggested next step and the teammates who are working on it too. The apply wizard walks through the five steps, and each action lands on your timeline for that company.

Research before the call

The research tab collects what you need before picking up the phone: what the company does and its products, vision, size, tech stack and hiring signals, how well it fits and why, talking points, what you could build for it, the state of its website and the sources behind the research.

Call script and email

Both come in Turkish and English and are filled with your details. The call script names the contact you chose and logs the call's outcome in one click.

The email greets the contact by name, ends with your signature, and can be copied or opened in your mail app. Marking it as sent moves the application forward.

The script, with the "Ask for" line aimed at the chosen contact.
The email, ready to copy or open in a mail app.

Contacts and company data

The people at each company, with verified or unconfirmed emails. Make my contact aims your script and email at someone. Below the people is every field from the research, from the address to the Google rating.

Members add and edit companies in a slide-over form; only administrators delete them.

Contacts, email states and every research field.
Adding a company.

Import and export

Every part of the workspace downloads as CSV for a spreadsheet or JSON for a backup: companies, contacts, call scripts and emails, applications, activity and users.

Every file can be imported again, here or in another AtheerJobs. The app recognises what a file holds, shows what will be new, updated or unchanged, and saves nothing until you confirm. Empty cells never erase data, and nothing is deleted.

The team and each pipeline

The users page lists everyone with their role, outreach numbers, CV and last activity. Administrators add, edit and remove accounts there.

Every person has a pipeline page with their numbers, a status filter, each company they work on with the next step, and their activity.

The users page.
A teammate's pipeline.

Your application profile

In Settings, each person keeps the details they apply with: headline, phone, contact email, portfolio, LinkedIn and a standard cover letter, plus a PDF CV that only they and administrators can download.

A preview shows how the placeholders will be filled and what the email signature looks like.

Dark mode and phones

The app follows the system's light or dark mode, or a choice made in Settings.

On a phone the board becomes a single list, and a company opens on its own page with the same tabs and wizard.

Dark mode.
The board on a phone.
A company on a phone.

Architecture

One job per layer

Controllers never query the database. They hand checked input to an action or a service and return a resource, so every rule lives in exactly one place.

  1. RouteEvery page and form sits behind sign-in.routes/app.php
  2. Form requestValidates the input and asks the policy.app/Http/Requests
  3. DTOCarries the checked, typed input.app/Data
  4. Action or serviceActions write in a transaction and raise events. Services read and aggregate.app/Actions · app/Services
  5. ResourceShapes every prop a page receives, with dates formatted on the server.app/Http/Resources
  6. React pageRendered with Inertia, on the server first and then in the browser.resources/js/pages

Events and listeners keep the activity log: every call, email, note, status change and follow-up becomes an entry on the application's timeline.

What is shared and what is personal

Shared by the team Kept per person
CompaniesResearch notes, fit, website state, rating ApplicationsOne per company: status, contact person, dates, next step, notes
ContactsTitle, email and whether it is verified, the key contact ActivityEvery call, email, note and status change, with the time it happened
Call scripts and emailsTurkish and English, with placeholders Application profileHeadline, phone, email, links, cover letter and a private CV

Roles that mean something

Administrators and members, backed by named permissions. Policies check permissions by name, with no shortcut for administrators, so safeguards such as "keep the last administrator" apply to everyone.

Typed routes

Wayfinder generates a TypeScript function for every route, so links and forms in React cannot drift from the backend.

Search that ignores accents

A search column keeps company names, research and contact names without accents, because databases only fold ASCII letters. muller finds Müller, and ilker finds İLKER.

Data that stays private

Real company data is imported from a git-ignored file, CVs live on a disk the web server never serves, and exports stay out of the repository.

Quality

Checked on every push

475Pest tests; 464 run and pass, 11 cover starter-kit features that are switched off
7PHPStan level, with Larastan, for all application code
0lint or format warnings allowed in PHP and TypeScript
2databases the suite runs on: SQLite in development, MySQL 8 as in production

GitHub Actions runs the whole check on every push to main: formatting, linting, TypeScript, Pint, PHPStan and the Pest suite. The repository carries guides for the architecture, the domain model, permissions, import and export, and development. A script retakes these screenshots from the demo data whenever the interface changes.

Technology

What it runs on

Backend

  • PHP 8.4 and Laravel 13
  • Fortify: passwords, passkeys, two-factor
  • spatie/laravel-permission for roles
  • SQLite, or MySQL in production

Frontend

  • Inertia v3 with React 19 and the React Compiler
  • Server-side rendering
  • TypeScript and Wayfinder routes
  • Tailwind CSS v4 and shadcn/ui

Tooling

  • Pest 5 for tests
  • PHPStan and Pint for PHP
  • vite-plus for building, linting and formatting
  • pnpm and GitHub Actions