Skip to content
2023–present Side project · design & build

CIWEI Job Board

Design jobs from multiple sources, filtered and organized into one daily board.

CIWEI Job Board

The project

I designed, built, and continue to run a design job board. It checks more than ten sources each night, filters for design roles, and publishes the results in one readable table.

My role

Solo creator · design & engineering

Status

Live · operated daily

Thirty minutes a day spent re-reading the same listings

I built this while job-hunting. The routine was half an hour every morning across LinkedIn, BOSS Zhipin, Lagou, Maimai, and a handful of company boards — and most of that half hour was not reading jobs. It was recognizing the ones I had already rejected yesterday, translating four different ways of writing a salary, and scrolling past engineering roles that matched on the word “design”.

The goal was to spend less time cleaning up listings and more time deciding which roles fit.

Published CIWEI capture with filters and an aligned job listing row

Loading image…

01 · The published board. Company, title, work type, experience, salary, and Apply stay aligned. This is a captured listing, not a live vacancy feed.
Detail of Sr Experience Designer and Austin, TX, Remote in the same captured listing

Loading image…

02 · Does the role and place fit? Work type, experience, and salary stay on the same row.

Spend attention on deciding whether the role fits. The curation example below explains how rows become comparable. It is a reconstruction with illustrative data, not an earlier design version.

The problem

A useful job board needs to remove irrelevant listings, not just collect more of them.

Stage 01

The pipeline

A crawl, three judgments, and a static page

Each night, a scheduled job checks the sources, classifies design roles and normalizes the retained listings. It publishes a static file, keeping the daily board independent of an application server.

What happens between midnight and the morning read

What happens between midnight and the morning read

Collect

Nightly, unattended

  • Scheduled crawl
  • 10+ sources

Judge

Where the board earns its keep

  • Design role?
  • Duplicate?

Normalize

One shape, five columns

  • Pay & location
  • Metro grouping

Publish

No server to keep alive

  • Sheet as CMS
  • Static page
From source collection to a readable daily board.
What each stage is built from

Puppeteer under GitHub Actions for the crawl; an AI pass for role classification; a Google Sheet as the store, exported as CSV and parsed in the browser with PapaParse; DataTables for the table itself; PDF.js to read an uploaded résumé entirely client-side. Deployed on Netlify at no running cost.

Stage 02

Curation

Filter roles, normalize listings and highlight possible matches

Aggregation is the part people notice and the part that matters least. What makes a board worth opening is what it refuses to show, and how much of a posting it is willing to read on your behalf. Turn the three judgments off — keep design roles once each, normalize pay and place, and match the résumé — and the board becomes the thing it was built to replace.

12 rows in this sample 7 kept 3 star suggestions

Six of 12 sample rows are shown. Excluded rows stay faintly visible so you can inspect what was removed.

One morning of scraped listings, with the board’s three judgments applied
CompanyJob titleYOESalaryLocation
PayPalLinkedIn★Sr Experience Designer Full-time 3 yrs experience · $130.5k – $212.8k · Austin · Hybrid 3 yrs$130.5k – $212.8kAustin · Hybrid
ByteDanceBoss 直聘资深交互设计师 Full-time 5 yrs experience · ¥40k – 70k · 15 mo · Beijing · Haidian 5 yrs¥40k – 70k · 15 moBeijing · Haidian
StripeLinkedInSoftware Engineer, Frontend Full-time 4 yrs experience · $180,000 – $250,000 · Remote (US) Engineering4 yrs$180,000 – $250,000Remote (US)
MeituanMaimai设计项目经理(PMO) Full-time 6 yrs experience · 面议 · 北京 Programme mgmt6 yrs面议北京
FigmaGreenhouse★Product Designer, Growth Full-time 4 yrs experience · Not disclosed · SF · NYC 4 yrsNot disclosedSF · NYC
Unnamed startupBoss 直聘设计师(急招急招急招) Full-time 1 yr experience · 8-12K · 杭州 Reposted, 14 days1 yr8-12K杭州
A reconstructed morning’s feed: real posting patterns from the sources the crawler reads, with illustrative company names and figures. The board itself runs this daily on a Sheets-backed pipeline.

Résumé matching needed a cautious role. It marks possible matches with a star rather than hiding other jobs, because a missed opportunity is harder for the reader to recover than an extra row to review.

Stage 03

The build

Choose an architecture one person can maintain

A side project’s real constraint is the day it stops being interesting. I designed for that day: no database to migrate, no server to patch, no account system to support, and editable data I can fix from a phone.

  • Google Sheet as the store

    What it bought
    Edit a listing directly from a phone.
    What it cost
    A hard ceiling on data volume, and no relational structure.
  • Static export, no backend

    What it bought
    Zero running cost and nothing to keep alive.
    What it cost
    No personalized feed; everything per-reader happens in the browser.
  • Résumé parsed client-side

    What it bought
    No one has to trust me with their résumé — it never leaves the tab.
    What it cost
    Matching quality is limited to what the browser can read.
  • Scheduled crawl, no queue

    What it bought
    One moving part, one log to read when it breaks.
    What it cost
    A source that changes its markup is silently missing for a day.
What each choice traded away
ChoiceWhat it boughtWhat it cost
Google Sheet as the storeEdit a listing directly from a phone.A hard ceiling on data volume, and no relational structure.
Static export, no backendZero running cost and nothing to keep alive.No personalized feed; everything per-reader happens in the browser.
Résumé parsed client-sideNo one has to trust me with their résumé — it never leaves the tab.Matching quality is limited to what the browser can read.
Scheduled crawl, no queueOne moving part, one log to read when it breaks.A source that changes its markup is silently missing for a day.

A daily board with returning readers

Checking CIWEI every morning has become a habit. Much more convenient than browsing several sites myself.
UI designer, returning user

The board has operated since 2023, with a few hundred monthly users, dozens of mailing-list subscribers and a majority of visits from returning readers. Return visits help me judge whether the daily updates remain useful.

What I would change: the classifier is a single judgment with no appeal, and I have no way to see the roles it wrongly discarded. The next version should log its own rejections so the filter can be argued with.