# CONTENT.md — the canonical content pack

**Every one of the 50 v2 design directions uses this content verbatim.** Only the design varies.
That is what makes 50 directions comparable rather than 50 different websites.

> **Rule:** do not rewrite, shorten, "improve", or re-order this copy. Do not invent extra posts,
> extra sections, or a different persona. If a layout needs a label the content pack doesn't have
> (e.g. a section heading like "Latest" or a column header), you may invent *that* — but never the
> post titles, summaries, dates, article prose, or About copy.

Everything below is extracted verbatim from `mockups/option-28.html`, `mockups/post-5.html` and
`mockups/about-4.html`.

---

## 0. Persona and shared chrome copy

- **Author:** Priya Nair — executive-search consultant, London. Solo desk placing senior and
  leadership technical talent (engineering, data, security) at growth-stage tech companies.
- **Wordmark:** `Hiring Nerd` (non-breaking space between the words: `Hiring&nbsp;Nerd`). The
  original design added a mono caret `_`. **v2 directions should invent their own wordmark
  treatment** — the caret is optional, not required.
- **Nav / topics:** `sourcing`, `reviews`, `deep dives`, `about` (the three content pillars plus
  About). Case and styling are yours.
- **Footer nav:** `Sourcing`, `Reviews`, `Deep Dives`, `About`, `RSS`
- **Contact:** `hello@hiringnerd.com` · LinkedIn `/in/priyanair` · GitHub `/priyanair` · RSS
- **Colophon line:** `© 2026 Hiring Nerd` and a second line naming the typefaces the design uses,
  e.g. `set in Fraunces, Newsreader & IBM Plex Mono` — **update this to your own typefaces.**

### Newsletter block (footer, all three pages)

```
The Hiring Nerd letter
One considered email a week. Sourcing tactics, tool reviews, and the odd build log. No spam, unsubscribe in a click.
[ you@company.com ] [ Subscribe ]
```

Markup pattern (keep the a11y attributes; restyle freely):

```html
<form onsubmit="return false">
  <input type="email" placeholder="you@company.com" aria-label="Email address" required>
  <button type="submit">Subscribe</button>
</form>
```

---

## 1. Homepage content

### Lede / masthead block

```
Priya Nair · Executive-search consultant · London
Notes from a solo desk.
Sourcing that actually works, honest tool reviews, and the odd build log from running search on my own terms.
```

### The 8 canonical posts (newest first — all 8 must appear on the homepage)

Each post links to `post.html`. The three pillars — **Sourcing**, **Reviews**, **Deep Dives** —
must be visually distinguishable somehow (colour, type, position, label, whatever your direction
calls for).

| # | Pillar | Date | Read | Title | Summary |
|---|---|---|---|---|---|
| 1 | Deep Dives | 12 Jul 2026 | 9 min read | Building a local LLM pipeline to score inbound applicants | Ollama, a scoring rubric, and Postgres — a weekend project that became a daily workflow, so candidate data never leaves the laptop. |
| 2 | Sourcing | 08 Jul 2026 | 6 min read | The 20-minute Boolean string that beats your ATS search | Most in-tool search is lossy on purpose. The structure I use to surface senior engineers the platform quietly hides. |
| 3 | Reviews | 01 Jul 2026 | 11 min read | Ashby after six months: the good, the rough, and the pricing | An honest review from a solo desk — where it genuinely saves time, and where the reporting still fights me. |
| 4 | Sourcing | 24 Jun 2026 | 5 min read | Stop asking for CVs: what a good intro message actually contains | Response rate isn't about personalisation tricks. It's about what you're willing to say first. |
| 5 | Deep Dives | 17 Jun 2026 | 14 min read | Self-hosting a candidate CRM: Postgres, a bit of Python, and no vendor lock-in | I stopped renting my pipeline. What it took to own it — and the two things I'd still pay a vendor for. |
| 6 | Reviews | 09 Jun 2026 | 8 min read | I tried five AI note-takers on real screening calls. One survived. | Accuracy on names and numbers is where they fall apart. A field test with candidates who consented. |
| 7 | Sourcing | 30 May 2026 | 7 min read | How to read a GitHub profile like a recruiter, not a stalker | Signal versus noise in public code — what tells you something real, and what tells you nothing at all. |
| 8 | Deep Dives | 21 May 2026 | 10 min read | Running Llama 3 on a Mac mini to draft outreach that doesn't sound like a robot | Local, cheap, and private. The prompt scaffold and guardrails that keep it in my voice, not the model's. |

**Date format** is yours to choose (`12 Jul 2026`, `2026-07-12`, `12.07.26`, `Jul 12`) as long as
it's consistent within the design and the actual dates are unchanged. Post 1 is the newest and is
the natural candidate for feature treatment if your layout has one.

---

## 2. Post page content — the deep-dive article

One article, same in all 50 directions. It is the post that homepage card #1 links to.

### Header

```
Deep dive                                          ← eyebrow / kicker
Building a local LLM pipeline to score inbound applicants   ← h1
A weekend project that became a daily workflow — and why not a single CV leaves the laptop.   ← standfirst
```

### Front-matter meta block

The original design rendered this as YAML-ish key/value pairs. **The four facts are fixed; the
presentation is yours** — byline row, spec table, sidebar, dateline, whatever fits.

```
topic:     deep-dives
published: 2026-07-12
reading:   9 min
stack:     ollama · postgres · python
```

### Body (verbatim — 4 sections with fixed heading ids)

**Opening (before the first h2):**

```html
<p>Every recruiter I know has the same quiet anxiety about inbound: the good applications get buried under the volume, and the tools that promise to fix it want to hoover up every CV into a model you can't see. I wanted the opposite — a system that reads applications the way I would, ranks them against the actual brief, and keeps every byte of candidate data on hardware I own.</p>
<p>This is the build. It runs on a <strong>Mac mini</strong> under my desk, costs nothing per query, and has scored roughly four thousand applications without a single row leaving the machine. Here's how it fits together, what worked, and the parts I'd still change.</p>
```

**§1 — `<h2 id="problem">The shape of the problem</h2>`**

```html
<p>Scoring a CV is not a ranking problem, it's a <em>reading</em> problem. A keyword filter throws out the career-changer with exactly the right transferable experience and keeps the person who pasted the job description into their summary. So the first decision was to give a local model the same rubric I'd hand a junior researcher, and ask it to explain itself.</p>
<blockquote><p>The moment you can read the model's reasoning next to its score, you stop trusting the score and start trusting the process. That's the whole game.</p><cite>— from my own notes, week two</cite></blockquote>
<p>The pipeline has three stages: <strong>ingest</strong> (parse the CV to clean text), <strong>score</strong> (run it through the model against a rubric), and <strong>store</strong> (write score, reasoning, and flags to Postgres). Nothing exotic.</p>
```

**§2 — `<h2 id="model">Wiring up the model</h2>`**

```html
<p>I use <a href="#">Ollama</a> to serve the model locally. The scoring call is a single prompt with the rubric baked in and the CV text appended. The key trick is forcing structured output so the result drops straight into a database column.</p>
```

…then the **code block** (see §2a below), then:

```html
<p>Temperature stays low so scores are stable run-to-run. The <code>format="json"</code> flag matters more than the prompt — without it you spend your evening writing regex to fish a number out of a paragraph.</p>
```

…then the **figure** (see §2b below).

**§3 — `<h2 id="numbers">What the numbers looked like</h2>`**

```html
<p>After a month I compared the model's top-decile picks against the candidates I'd actually progressed. The overlap was better than I expected, and where it disagreed it was often <em>right</em> — surfacing people I'd have skimmed past.</p>
```

…then the **table** (see §2c), then:

```html
<p>The 8B model won on the desk because latency compounds: at two seconds a CV, a morning's inbound clears while I make coffee. The gap to 70B wasn't worth a fourteen-fold slowdown for my volume.</p>
```

…then the **inline newsletter CTA** (see §2d).

**§4 — `<h2 id="change">The parts I'd still change</h2>`**

```html
<p>Two things. First, the rubric lives in a Python dict, which means editing code to tweak a brief — that belongs in a small table so I can change it from a UI. Second, I score CVs in isolation; the interesting signal is <em>relative</em>, and a re-ranking pass across the whole batch would sharpen the top ten considerably.</p>
<ul>
  <li>Move the rubric into Postgres so briefs are data, not code.</li>
  <li>Add a batch re-rank pass for relative scoring.</li>
  <li>Log the model's reasoning verbatim — it's the audit trail that makes this defensible.</li>
</ul>
<p>None of this is hard. That's rather the point: the tools to keep candidate data private and score it well are sitting on your machine already. You just have to wire them up.</p>
```

**Tags (end of article):** `#deep-dives` `#local-llm` `#self-hosted` `#sourcing`

### §2a — Code block (language: `python`, file: `score.py`)

Syntax colours are **hand-authored spans** — `.tok-com` comment, `.tok-key` keyword, `.tok-fn`
function, `.tok-str` string, `.tok-num` number. Recolour these tokens to suit your palette; keep
the class names and the code exactly as-is.

**⚠ The `<pre>` must keep `white-space: pre`.** A previous mockup (`post-8.html`) lost it when a
line-number gutter was added and the code collapsed onto one line. Do not repeat that.

```html
<figure class="code">
  <div class="code-top"><span class="lang">python</span><button class="copy" type="button">copy</button></div>
<pre><code><span class="tok-com"># score.py — rank one application against the live brief</span>
<span class="tok-key">import</span> ollama, json

<span class="tok-key">def</span> <span class="tok-fn">score_candidate</span>(cv_text, rubric):
    prompt = <span class="tok-str">f"""You are screening for: {rubric['role']}.
Score 0-100 on fit. Return JSON with keys:
score, reasoning, flags."""</span>
    resp = ollama.<span class="tok-fn">chat</span>(
        model=<span class="tok-str">"llama3.1:8b"</span>,
        messages=[
            {<span class="tok-str">"role"</span>: <span class="tok-str">"system"</span>, <span class="tok-str">"content"</span>: prompt},
            {<span class="tok-str">"role"</span>: <span class="tok-str">"user"</span>, <span class="tok-str">"content"</span>: cv_text},
        ],
        format=<span class="tok-str">"json"</span>,        <span class="tok-com"># hard-constrain to JSON</span>
        options={<span class="tok-str">"temperature"</span>: <span class="tok-num">0.2</span>},
    )
    <span class="tok-key">return</span> json.<span class="tok-fn">loads</span>(resp[<span class="tok-str">"message"</span>][<span class="tok-str">"content"</span>])</code></pre>
</figure>
```

**Copy button** — required, and it must actually work. Shared script (place before `</body>`):

```html
<script>
document.querySelectorAll('.copy').forEach(function(btn){
  btn.addEventListener('click',function(){
    var code=btn.closest('figure').querySelector('code').innerText;
    navigator.clipboard.writeText(code).then(function(){var t=btn.textContent;btn.textContent='copied';setTimeout(function(){btn.textContent=t;},1400);});
  });
});
</script>
```

### §2b — Figure: inline SVG pipeline diagram (`.wide` breakout)

Four boxes — `inbox` (.eml / .pdf) → `parse` (clean text) → `llama 3.1 8B` (score + reasoning) →
`postgres` (local disk); an italic note "— nothing crosses the network boundary —"; a dashed rule.

**Keep the structure, the labels, the `<title>`, and the `role="img" aria-labelledby` wiring.
Recolour the fills/strokes/fonts to match your direction** — the hexes below are the old palette.

```html
<figure class="fig wide">
  <div class="frame">
    <svg viewBox="0 0 1040 300" role="img" aria-labelledby="digt">
      <title id="digt">Pipeline: inbox to Postgres, all on-device</title>
      <rect width="1040" height="300" fill="#FBFAF7"/>
      <g font-family="'IBM Plex Mono',monospace" font-size="14" fill="#1B1A18">
        <rect x="40" y="115" width="150" height="70" rx="6" fill="#fff" stroke="#E6E2D9"/><text x="115" y="147" text-anchor="middle">inbox</text><text x="115" y="167" text-anchor="middle" fill="#6B6862" font-size="11">.eml / .pdf</text>
        <rect x="270" y="115" width="150" height="70" rx="6" fill="#fff" stroke="#E6E2D9"/><text x="345" y="147" text-anchor="middle">parse</text><text x="345" y="167" text-anchor="middle" fill="#6B6862" font-size="11">clean text</text>
        <rect x="500" y="105" width="170" height="90" rx="6" fill="#E9F5F0" stroke="#0E7A5A"/><text x="585" y="140" text-anchor="middle" fill="#0B6249">llama&#8201;3.1&#8201;8B</text><text x="585" y="162" text-anchor="middle" fill="#0B6249" font-size="11">score + reasoning</text>
        <rect x="750" y="115" width="150" height="70" rx="6" fill="#fff" stroke="#E6E2D9"/><text x="825" y="147" text-anchor="middle">postgres</text><text x="825" y="167" text-anchor="middle" fill="#6B6862" font-size="11">local disk</text>
        <g stroke="#9A968C" stroke-width="1.5" fill="none"><path d="M190 150 H262" marker-end="url(#a)"/><path d="M420 150 H492" marker-end="url(#a)"/><path d="M670 150 H742" marker-end="url(#a)"/></g>
        <text x="520" y="60" fill="#6B6862" font-size="12" font-style="italic">— nothing crosses the network boundary —</text>
        <line x1="40" y1="235" x2="1000" y2="235" stroke="#E6E2D9" stroke-dasharray="4 4"/>
      </g>
      <defs><marker id="a" markerWidth="8" markerHeight="8" refX="6" refY="4" orient="auto"><path d="M0 0 L8 4 L0 8 z" fill="#9A968C"/></marker></defs>
    </svg>
  </div>
  <figcaption><span class="num">Fig. 1</span> — The whole pipeline runs on-device. The only thing that reaches the internet is the job advert going out.</figcaption>
</figure>
```

### §2c — Table

```html
<div class="twrap"><table>
  <thead><tr><th>Model</th><th>Size</th><th>Agreement with my shortlist</th><th>Median latency</th></tr></thead>
  <tbody>
    <tr><td class="mono">llama3.1:8b</td><td>8B</td><td>81%</td><td><span class="mono">1.9 s</span></td></tr>
    <tr><td class="mono">llama3.1:70b</td><td>70B</td><td>88%</td><td><span class="mono">14 s</span></td></tr>
    <tr><td class="mono">qwen2.5:14b</td><td>14B</td><td>84%</td><td><span class="mono">3.4 s</span></td></tr>
  </tbody>
</table></div>
```

Keep `.twrap` (or your own equivalent) as an `overflow-x:auto` wrapper so the table never forces
horizontal page scroll on mobile.

### §2d — Inline newsletter CTA (mid-article)

```
Build logs, by email                                    ← kicker
Get the next one before it's polished                   ← h3
I send one email a week: a sourcing tactic, a tool review, or a build log like this. Roughly 3,000 recruiters and builders read it.
[ you@company.com ] [ Subscribe ]
```

This is **in addition to** the footer newsletter block.

---

## 3. About page content

### Intro

```
About · Hiring Nerd                                     ← eyebrow
I'm Priya. This is where I show my working.             ← h1
```

```html
<p>Hiring Nerd is my open notebook on the craft of finding senior technical people — and on the tools that make that craft faster, better, and a bit less grim. I run a solo executive-search desk from London, placing engineering, data, and security leaders at growth-stage tech companies. Roughly once a week I write down what I've learned.</p>
<p>It's for recruiters and talent leaders who want to get properly good at the work; for founders doing their own senior hiring; and for technically-minded builders who find the recruiting problem more interesting than it looks. Direct, opinionated, British, no fluff.</p>
```

**Pull line:** *The interesting edge of recruiting is now technical — and I'd rather write from it than pretend otherwise.*

### The three pillars

Section intro: `Three things I write about — each with its own colour.`
(If your direction doesn't code the pillars by colour, reword this one line to match — e.g.
"Three things I write about." This is the one exception to the no-rewrite rule.)

**Sourcing — The craft of finding people**
> Sourcing is a craft, not a numbers game. This is the practical stuff — boolean that actually holds up, outreach that gets a reply, and how to read a career, not just a keyword. The tactics I use on live searches, written plainly.

*recent in this strand:* `Boolean is a language, not a party trick →` · `The outreach opener that doubled my reply rate →`

**Reviews — The recruiting stack, honestly**
> Honest reviews of the tools we all pay for — ATSs, sourcing plugins, sequencers, the lot. A review should stay honest even when it costs me the affiliate link, so it does. What's worth the money, what isn't, and where the polish hides the gaps.

*recent in this strand:* `Ashby after a year on the desk →` · `The LinkedIn Recruiter tax, itemised →`

**Deep Dives — Build logs from my own tools**
> The best recruiters will be part-builder. So I build: a self-hosted candidate CRM, a local-LLM CV scorer — kept on hardware I control, because candidate data is a responsibility. These are the technical build logs, done badly at first, then less badly.

*recent in this strand:* `Scoring CVs on a Mac mini with a local model →` · `Why my candidate CRM is a boring Postgres box →`

### Bio — `Who's writing this`

```html
<p>I've been in the trade about twelve years — in-house talent at a London fintech, then a boutique technical search firm where I learned the deep end of engineering hiring, then independent since 2022. Somewhere along the way I started scripting my own searches to claw back time, and never really stopped. Now I self-host the tooling and write the whole thing down here.</p>
```

**Three credibility facts:**
- **~3,000** readers
- **100+** senior engineers & leaders placed
- **self-hosted** tooling, my own hardware

### Subscribe block (About page version)

```
The Hiring Nerd letter
One considered email a week — a sourcing tactic, a tool review, or a build log. No spam, unsubscribe in a click. It's the best way to follow along.
[ you@company.com ] [ Subscribe ]
```

### Contact

```
Say hello, or ask about a search:
hello@hiringnerd.com   (mailto:)
LinkedIn /in/priyanair
GitHub /priyanair
RSS
```

---

# THE QUALITY CONTRACT

Every one of the 150 files must satisfy all of this. It is checked automatically.

### Structure
1. `<!DOCTYPE html>` · `<html lang="en-GB">` · `<meta charset="utf-8">` ·
   `<meta name="viewport" content="width=device-width, initial-scale=1">`
2. `<title>Hiring Nerd — {Direction name}</title>` (post page may prefix the article title).
3. **Single self-contained file.** All CSS in one inline `<style>`; all JS inline and vanilla.
   No build step, no frameworks, no external files.
4. **The only permitted network requests are Google Fonts** (`fonts.googleapis.com` /
   `fonts.gstatic.com`) — or none at all if the direction uses the system font stack.
   No CDN scripts, no remote images, no icon fonts. Illustration must be inline SVG or pure CSS.

### Accessibility
5. `<a class="skip" href="#main">Skip to content</a>` as the first element in `<body>`, visually
   hidden until `:focus`, and a matching `<main id="main">`.
6. Semantic landmarks: `<header>`, `<main>`, `<footer>`, `<article>`, `<nav aria-label="…">` on
   every nav, `aria-labelledby` on major sections.
7. A visible `:focus-visible` style with real contrast against its background.
8. `@media (prefers-reduced-motion: reduce)` that genuinely neutralises every animation,
   transition, scroll-driven effect and `scroll-behavior: smooth` the design uses.
9. Inline SVG: `role="img"` + `aria-labelledby` + a `<title>`. Form inputs: `aria-label` or a
   real `<label>`.
10. **WCAG 2.2 AA contrast** on body text and UI text — in *every* theme the design ships
    (if you build light + dark, both must pass).

### Responsive
11. Works from 360px to 1600px+. A real mobile layout, not a squashed desktop one.
12. **No horizontal page overflow at 360px.** Wide elements (tables, code blocks, diagrams,
    horizontal scrollers) scroll inside their own container, never the body.
13. Don't repeat `option-26.html`'s bug: hero headlines need enough measure not to wrap one word
    per line. Test your biggest type at 1280px *and* 390px.

### Required elements
14. **Homepage** — masthead/lede block, all 8 posts, the three pillars visually distinguished,
    footer newsletter form, footer nav.
15. **Post page** — eyebrow, h1, standfirst, the four meta facts, all 4 `<h2>`s with their ids
    (`problem` / `model` / `numbers` / `change`), the blockquote + cite, the code block **with a
    working copy button** and `white-space: pre`, the SVG figure + figcaption as a `.wide`
    breakout, the table in an overflow wrapper, the inline CTA, the closing `<ul>`, the tags.
16. **About page** — eyebrow + h1, the lede paragraphs, the pull line, all three pillar blocks
    with their "recent in this strand" links, the bio, the three credibility facts, the subscribe
    block, the contact block.

### Linking (within a direction's folder)
17. Homepage cards → `post.html`. Wordmark → `index.html`. Nav "about" → `about.html`.
    Post and About link back to `index.html`.
18. Every page carries a small, unobtrusive **`← all v2 designs`** link to `../index.html`
    (top-left or footer — your call, but keep it consistent across the three pages and out of the
    way of the design).
19. Everything else (topic nav, tags, in-body links, "recent in this strand", social) stays
    `href="#"`, except `mailto:hello@hiringnerd.com`.

### Ghost buildability
20. Every layout must be producible from real Ghost post data — title, excerpt, date, reading
    time, tag, feature image (optional, never required). No hand-placed per-post artwork, no
    layouts that only work because there happen to be exactly 8 posts in a specific pillar order,
    no content Ghost can't supply.
21. Degrade gracefully: wrap `scroll-timeline`, `view-transition`, `anchor-name`, `subgrid` etc.
    in `@supports` (or rely on their natural no-op fallback) so the page is fully usable without
    them.

### Craft
22. **The three pages must read as one website** — same type system, colour system, spacing
    rhythm, chrome and voice. Build the post page first, then derive the homepage and about page
    from the system it establishes.
23. Commit to the direction. A brief that says "extreme weight contrast" means extreme, not a
    slightly bolder h1. Half-committed directions are the failure mode of this exercise.
24. Avoid the flagged AI-design clichés: terracotta/clay palettes, acid-lime accents, generic
    hairline-broadsheet columns, decorative `01/02/03` numbering where the order isn't a real
    sequence, and the default "purple gradient SaaS" look.

---

## 4. Content added for the theme mockups (this repo)

The pages beyond the original three needed copy the pack did not have. Everything below was
invented for `hiringnerd-theme/mockups/` in the same voice; everything else on those pages is
verbatim from §0–§3. Chrome strings shared by every page: spine title `On this page`, spine
`aria-label="Reading progress"`, skip link `Skip to content`, contact-sheet backlink `← all pages`,
form success line `Check your inbox — a sign-in link is on its way.`, form error line
`Something went wrong sending the sign-in link. Try again in a minute.`, colophon
`set in Saira & Source Serif 4 · Powered by Ghost`.

### Home (`home.html`)
- Spine ticks: `latest / The newest post` · `pillar / Sourcing` · `pillar / Reviews` · `pillar / Deep Dives` · `who / About Hiring Nerd` · `subscribe / The Hiring Nerd letter`
- Pillar section rows: `Sourcing — The craft of finding people — All sourcing →` (and the same for Reviews / Deep Dives, descriptions from §3)
- About teaser: the first §3 intro paragraph, then a button `More about Priya and this site`
- Pagination: `← Newer` (disabled) · `Page 1 of 2` · `Older →`

### Post (`post.html`)
- Feature image caption (placeholder): `The whole thing runs on the Mac mini under the desk. Nothing leaves it.`
- Author card: `Priya Nair` · `Executive-search consultant · London` · `Solo desk placing senior engineering, data and security leaders at growth-stage tech companies. Self-hosts the tooling and writes the whole thing down here.` · links `All posts` `LinkedIn` `GitHub`
- Read next heading: `More deep dives` · comments heading: `Comments`
- Signup-card disclaimer: `Build logs, by email. No spam, unsubscribe in a click.`

### About (`page-about.html`)
- `<title>` `About — Hiring Nerd`; description `I'm Priya. This is where I show my working — an open notebook on the craft of finding senior technical people, and the tools that make it faster.`
- Spine ticks: `intro / About Hiring Nerd` · `pillars / Three things I write about` · `bio / Who's writing this` · `subscribe / The Hiring Nerd letter` · `colophon / How this site is built`
- Subscribe kicker `Subscribe`; signed-in replacement `You're on the list.`
- Colophon `How this site is built`: platform → `Ghost 6, self-hosted` · theme → `This one — built by me, source on GitHub` · type → `Saira + Source Serif 4, self-hosted` · comments → `Ghost native` · analytics → `None` · search → `Ghost native`

### Author (`author.html`)
- `<title>` `Priya Nair — Hiring Nerd`; description `Everything Priya Nair has written on Hiring Nerd — sourcing tactics, tool reviews and build logs from a solo executive-search desk in London.`
- Bio (maps to the Ghost author `bio` field): `I run a solo executive-search desk in London, placing senior engineering, data and security leaders at growth-stage tech companies — about twelve years in the trade, independent since 2022. I self-host my own tooling and write down what actually works here, roughly once a week.`
- Links `Website` · `LinkedIn /in/priyanair` · `GitHub /priyanair` · `RSS`; count `8 posts`; feed heading `All posts`

### Tag archive (`tag.html`, /tag/deep-dives/)
- `<title>` `Deep Dives — Hiring Nerd`; eyebrow `Topic`; count `3 posts`; standfirst = the Deep Dives pillar paragraph from §3 (becomes the tag description in Admin)
- Spine tick meta = the post date (the pillar name would repeat)

### Paged index (`index-page-2.html`, /page/2/)
- `<title>` `Page 2 — Hiring Nerd`; eyebrow `Page 2 of 2 · All writing`

### Pagination (all archives, `partials/pagination.hbs`)
`← Newer` · `Page {{page}} of {{pages}}` · `Older →`; nav label `Pagination`

### 404 (`404.html`)
- `<title>` `Page not found — Hiring Nerd`
- `404` · h1 `That page has moved on, or never existed.` (screen-reader prefix `404 — `)
- `If you followed a link from somewhere else, it's probably out of date. Check the address, try the search, or head back to the front page — the newest posts are just below.`
- Buttons `Back to the front page` · `Search the site`; section heading `Latest writing`

### Koenig test post (`post-koenig.html`)

Canonical post #3 rebuilt as a card test bed. Everything below is invented.


**Facts block:** topic `reviews` · published `2026-07-01` · reading `11 min` · stack `ashby · notion · zapier`
**Eyebrow:** Review · **Tags:** `#reviews` `#ashby` `#ats`
**Feature caption:** The board I look at forty times a day. Six months in, it's still the second monitor's only job.

## Section headings (h2 · id · spine key)

| # | Heading | id | key |
|---|---|---|---|
| 1 | Why I moved at all | `why` | why |
| 2 | The pipeline view | `pipeline` | pipeline |
| 3 | Sourcing inside the ATS | `sourcing` | sourcing |
| 4 | Where it genuinely saves time | `wins` | wins |
| 5 | Where it still fights me | `rough` | rough |
| 6 | Reporting: powerful, and in my way | `reporting` | reporting |
| 7 | The integrations | `integrations` | integrations |
| 8 | What it costs a solo desk | `pricing` | pricing |
| 9 | The verdict | `verdict` | verdict |
| 10 | Should you switch? | `switch` | switch |

Sub-headings: **What I'd tell a solo desk** (h3) · **And what I'd tell Ashby** (h4).

## Intro

Six months ago I moved the whole desk off a spreadsheet-and-Notion contraption and onto Ashby. I said I'd write it up once the novelty had worn off. It has. This is the honest version: what it's genuinely good at, what still makes me swear at a Tuesday afternoon, and what a solo desk actually pays.

The short answer is that I'm staying. The longer answer has a lot of **but** in it, and a fair amount of *it depends on your volume*. If you run a search desk on your own, most of this will map straight across. If you're in-house with a team of ten, skim the pricing section and go and read someone else's review — yours is a different product wearing the same logo. One housekeeping note: every screenshot here is from my own tenant, with the candidate names run through `faker` before export.

## Section prose

**Why I moved at all** — The old setup was a Notion database, three Zapier zaps and a Google Sheet that lied to me about which candidates were in process. It worked in the way a bicycle with a wobbly wheel works. What broke it was a retained search with four hiring managers who all wanted to see the pipeline without me pasting screenshots into email. / That's the recurring theme of this review: Ashby is an ATS built for hiring teams, and I'm using it as one person. Where those two facts line up it's excellent. Where they don't, the friction is mine to absorb.

**The pipeline view** — The pipeline is the thing you look at forty times a day, so it had better be good. It is. Drag between stages, bulk-move, a keyboard shortcut for nearly everything, and a filter bar that remembers what you asked it last time. The two wider views below are the same board with more of it showing.

**Sourcing inside the ATS** — Ashby's sourcing tooling is a browser extension plus a bulk import that reads LinkedIn exports cleanly. It won't replace a proper Boolean search — nothing built into an ATS ever does — but it has stopped me copying names into a spreadsheet by hand, which is the bar I actually cared about.

**Where it genuinely saves time** — Three things, and they're all boring, which is how you know they matter: scheduling, hiring-manager feedback forms, and the offer workflow. Between them they've handed me back something like three hours a week — a placeholder-precise number, but not far off. / Their own pitch, for the record — I don't disagree with any of it, which is rarer than it should be:

**Where it still fights me** — Two areas: reporting and the permissions model. The permissions model assumes a team, so as the single admin I end up granting myself things in circles. Reporting is a bigger topic and gets its own section below. The two toggles here are the bits I'd skip on a first read.

**Reporting: powerful, and in my way** — Ashby's reporting is a proper query builder, which is both the compliment and the complaint. It can answer almost any question about a pipeline. It just makes you build the question from scratch, and saved views don't share the way I'd expect — a report I built as admin is not automatically one the client can open. / For anything the builder won't do, I pull the export and run a query locally. The one I run most often: / The numbers that come out of that, over the six months, look like this. Placeholder-round, and only one desk's worth, so read the direction rather than the digits.

**The integrations** — The Zapier connector is solid and the Notion one is fine. The webhook payloads are well documented, which for someone who self-hosts their own tooling matters more than the number of logos on the integrations page. Everything below is the supporting material for that claim.

**What it costs a solo desk** — This is the section people email me about. Ashby doesn't publish a solo tier; you're on the entry plan and you pay for seats you won't use. It's not unreasonable, but it's priced for a company, and you'll feel that on the invoice every quarter.

**The verdict** — It's the best ATS I've used, and it is not built for me. Both are true. The question is whether the parts that are built for teams get in the way enough to cancel the parts that are simply excellent. For me, six months in, they don't.

**Should you switch?** — If you're a solo desk on a spreadsheet: probably yes, once you've a retained search that will pay for the year. If you're on Greenhouse and it's working: no, the gap isn't that wide. If you're on Lever: yes, and I'll explain why in a separate post rather than start a fight in this one.

**Closing** — Six months is long enough to know. I'll revisit this at the year mark, with the invoice, and say whether the answer's changed.

## Card copy

| Card | Copy |
|---|---|
| Image (default) | label `screenshot · pipeline` · caption: The pipeline for one search. The stages are mine; the columns, shortcuts and filters are Ashby's. |
| Image (wide) | label `screenshot · pipeline, wide` · caption: Wide: the kanban with every stage expanded. This is the view I keep open on the second monitor. |
| Image (full) | label `screenshot · full-bleed` · caption: Full width: the same board with the reporting sidebar open. Note how little room the sidebar leaves at laptop widths. |
| Gallery (3 + 2) | labels `extension · save`, `extension · notes`, `import · csv map`, `dedupe · merge`, `outreach · sequence` · caption: The sourcing flow, left to right: save from the extension, add notes, map a CSV import, merge duplicates, drop into a sequence. |
| Callout blue 💡 | Scheduling reads the interviewer's calendar and proposes slots. For a solo desk that means I stop being the person who emails five times to find a Thursday. |
| Callout yellow ⚠️ | Feedback forms are only as good as the questions in them. The default template asks for a thumbs-up. Rewrite it before your first search, not after. |
| Callout accent 🧾 | Offer approvals are the one workflow I'd pay for on its own. The audit trail has settled two "that's not what we agreed" conversations, and I [wrote up the second]. |
| Bookmark | title: Ashby — All-in-one recruiting software · description: Recruiting software for ambitious hiring teams: applicant tracking, scheduling, sourcing and analytics in one place, with the reporting built in rather than bolted on. · author: Ashby · publisher: ashbyhq.com |
| Toggle (closed) | heading: Why I don't use the built-in email sequences · body: They send from a shared domain, they can't read the notes field into the template, and the unsubscribe footer is the one Ashby wants, not the one I want. Outreach still goes from my own mailbox, drafted the way I described in the Llama post. |
| Toggle (open) | heading: The permissions workaround, step by step · body: Make a second "team" containing only you. Give that team the hiring-manager role on every search. Now the views a hiring manager would see are one click away, and you stop discovering that a report is invisible to the client the day before the review call. |
| Code (json) | a saved-report definition (`name`, `entity`, `groupBy`, `measures`, `filters`, `sharedWith: []`) · caption: A saved report, exported. This is the JSON you get when you ask for "time in stage by source" — note the empty `sharedWith`. |
| Code (bare, no language) | `select source, stage, median(days_in_stage) as median_days, count(*) as n from applications where created_at >= '2026-01-01' group by 1, 2 order by 1, median_days desc;` |
| Table (raw HTML) | Stage / Median days, Jan–Mar / Median days, Apr–Jun / Change — Screen 4.0 → 2.5 faster · Hiring-manager interview 9.0 → 6.0 faster · Panel 12.0 → 11.5 flat · Offer 7.0 → 3.0 much faster |
| File | title: Ashby webhook payloads, annotated · caption: The three events I listen to, with the fields I actually use marked up. · `ashby-webhooks.pdf` · 412 KB |
| Embed | label `embed · iframe 16:9` |
| Video (wide) | label `video · 16:9` · caption: Two minutes of the Zapier hand-off, recorded on the desk. No narration; there's nothing to say. |
| Audio | title: Notes on the Notion sync, recorded walking home · 0:00 / 12:41 |
| Product | Ashby Foundations · 4/5 stars · The entry plan: ATS, scheduling and the basic reports. One seat is all a solo desk needs, and the seat count is exactly what you'll end up arguing about. · button: See the plans |
| Header (v2 split, full) | heading: Six months, one desk, no regrets — and one invoice · sub: The full spreadsheet of what I paid, month by month, went out in the letter. Subscribers can reply and get the current version. · button: Read the letter |
| CTA (minimal, grey, image) | label: Sponsored · This post isn't sponsored. The card is here so the theme can style one; if a post ever is, it'll say so in exactly this spot, in exactly these words. · button: Learn more |
| CTA (immersive, blue, centred) | Weighing Ashby against Greenhouse or Lever? Reply to any issue of the letter and I'll send you the comparison sheet I keep for clients. · button: Get the sheet |
| Blockquote | An ATS is a place to put the truth about a search. Ashby is the first one that hasn't argued with me about what the truth is. — my notes, month four |
| Blockquote (alt) | Buy it for the workflows. Tolerate it for the reports. |
| Ordered list | 1. Rewrite the feedback template on day one, before anyone has used the thumbs-up. 2. Build three reports, share them with the client role, and never open the builder again. 3. Put the Zapier zaps in before the first search, not during it. |
| Unordered list | A solo tier. Even an unadvertised one. · Saved reports that are shared by default with the roles that need them. · A permissions preset called *just me*. |
| Button | Read the sourcing posts → tag.html |
| Signup (accent, wide) | heading: Get the pricing spreadsheet · sub: One email a week: a sourcing tactic, a tool review like this one, or a build log. Roughly 3,000 recruiters and builders read it. · disclaimer: Reviews, by email. No spam, unsubscribe in a click. |

## Read-next (More reviews)

- I tried five AI note-takers on real screening calls. One survived. — 09 Jun 2026 · 8 min read (canonical #6)
- The LinkedIn Recruiter tax, itemised — 28 Apr 2026 · 7 min read (title from the About page's "recent in this strand"; date and length invented here)
