TreeMap
A free, open-source disk-space visualizer. Squarified treemap, duplicate hunting, disk-full forecasting, and cleanup that only ever moves files to the Trash.
Fetches job openings on a schedule, filters them against your stated criteria, and presents the matches for review.
ProductivityTypeScript · ShellGitHub @malamoneyOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Fetches job openings on a schedule, filters them against your stated criteria, and presents the
matches for review.
CONTEXT.md is the glossary — Posting, Board, Corpus, Criteria, Match, Review State — and its
vocabulary is used throughout the code. Decisions that were hard to reverse are recorded in
docs/adr/.
Next.js 16 with React 19 and TypeScript, Tailwind 4, Neon Postgres through Drizzle. Tests run on
Vitest against a real Postgres, with outbound HTTP controlled by MSW.
Requires Node 22+, pnpm, and a Postgres you can reach.Read the full README ↗Fetches job openings on a schedule, filters them against your stated criteria, and presents the matches for review.
CONTEXT.md is the glossary — Posting, Board, Corpus, Criteria, Match, Review State — and its
vocabulary is used throughout the code. Decisions that were hard to reverse are recorded in
docs/adr/.
Next.js 16 with React 19 and TypeScript, Tailwind 4, Neon Postgres through Drizzle. Tests run on Vitest against a real Postgres, with outbound HTTP controlled by MSW.
Requires Node 22+, pnpm, and a Postgres you can reach.
pnpm install
cp .env.example .env.local # then fill in DATABASE_URL
pnpm dev
DATABASE_URL is a standard Postgres connection string. Neon is reached over the ordinary Postgres
wire protocol through its pooled connection string, so the same driver serves production, local
development, and tests.
pnpm db:generate # generate a migration from src/db/schema.ts
pnpm db:migrate # apply migrations to DATABASE_URL (your local database)
Local development runs against a local Postgres, never against Neon: .env.local is gitignored,
so when it once drifted to the production endpoint nothing said so, and a week of hot reloads
exhausted the project's monthly transfer allowance (#140). The guardrail (#156) is a rule rather
than a hostname: a process that is not a production build has no business opening a database that
is not on this machine. pnpm dev refuses a non-local DATABASE_URL at its first database use; a
pnpm script (warm-geocodes, seed:boards, db:migrate) warns once and proceeds, since those
are run against production on purpose; production builds and the test suite are silent. Set
ALLOW_REMOTE_DATABASE=1 in the environment when you mean it.
Production is migrated by the migrate production CI job when a PR merges to main. It runs
pnpm db:migrate against the PROD_DATABASE_URL repository secret and is gated to main, so
preview builds never migrate anything.
A sweep covers the Boards listed in scripts/data/*-boards.ts — one file per ATS Source
(greenhouse, lever, ashby, workable, recruitee), plus the aggregator and Workday lists —
maintained by hand. Curation rather than harvesting is a cost decision (ADR 0003); the
harvest-and-probe process behind each list is ADR 0008.
pnpm seed:boards # probe every listed Board, then write it to the curated set
pnpm discover # harvest fresh candidates and print what is worth promoting
pnpm boards:status # what the set looks like now, and what has died
Seeding probes each Slug before writing it, so it proves the set is fetchable rather than asserting it, and a Board that cannot be read is added disabled rather than skipped. It is safe to re-run, which is the normal case as the list grows: a Board keeps the id its Postings already reference, and keeps whether it is currently swept. Seeding says which Boards exist, not which are enabled — so a Board you turned off stays off, and one transient timeout will not knock a good Board out of the sweep.
pnpm discover is run by hand and by nothing else, and writes nothing. It harvests candidate Slugs
from Common Crawl for one Source, probes every one not already curated, and prints the live ones
ranked by how much they are advertising, each with a few of its titles — a count alone cannot tell
a robotics company from a staffing agency, and the set is meant to lean toward the roles being
searched for. Promoting a Board means pasting its Slug into that Source's seed file and re-running
pnpm seed:boards.
pnpm discover -- --source ashby # greenhouse (default), lever, ashby, workable, recruitee
pnpm discover -- --limit 300 # probe a random 300 rather than the whole harvest
pnpm discover -- --pages 2 # read part of the index for a quick look, not a real sample
Beware --pages: the index is sorted, so each page is a stretch of the alphabet. Reading two of
seven pages does not give you two-sevenths of the Boards, it gives you every Board starting with
"a". A run that could not read a page says so loudly for the same reason. --limit is the safe
way to shorten a run — a uniform-random draw, not the front of the list.
Roughly one in six Slugs goes dead over time, so the set decays. pnpm boards:status lists every
Board with what its last Fetch did, worst first, so the ones worth disabling are at the top.
pnpm test # once
pnpm test:watch # watch mode
Tests need a running Postgres and nothing else. The test database is created and migrated
automatically on the first run; .env.test holds the local default, and .env.test.local
(gitignored) is where to put an override if your Postgres wants credentials.
src/test/harness.test.ts is the worked example every later test copies. Four rules hold:
src/operations exports the operations the application performs —
run a Fetch, match Criteria, read the Dashboard, mutate Review State. Tests call these directly.
Source adapters are tested through this seam rather than given their own, so one assertion
exercises the adapter, the upsert, and persistence together. The only lower seam is pure
normalizers, which are tested directly.getDb() handle in tests as in
production, pointed at a test database. No test-shaped hole for injecting a client.fetch exactly as
it does in production; a test declares the responses it needs with server.use(...). A request no
test declared fails loudly rather than reaching the network.Each test starts from empty tables: resetDatabase() truncates the public schema before every
test. Truncating rather than wrapping each test in a transaction is what lets the code under test
manage transactions of its own, which Fetch orchestration needs when it claims tasks. Nothing
survives between tests, so reference data such as Boards is seeded per test. Because the suite
shares one database, fileParallelism is off — concurrent files would truncate each other's rows
mid-test.
src/db/test-schema.ts, drizzle/test/, and src/test/harness-operations.ts exist only to give
the harness something real to exercise. They are never applied to production.
.github/workflows/ci.yml runs typecheck, lint, test, and build on every pull request and
on pushes to main. The test job runs against a Postgres service container.
These four job names are what the required_status_checks rule on the main ruleset names.