Self-Hosted Job Search Site

Platforms

A job search site: visitors can search and filter jobs, and the site already holds made-up demo companies and jobs. You bring it up on your own machine with Docker Compose, and the database password and the sign-in signing key are generated at random by a script. Derived from a frozen snapshot of an open-source project under the MIT licence; the delivery adds an orchestration file (website, API, database, search engine, cache and file storage), a Dockerfile that builds the images from source, a script that generates the keys, made-up demo data and a quick-start guide in Traditional Chinese. No real job listings are included.

SubscriptionUS$49 per month
Last run2026-11-02
In practice
Readiness4 / 5
What you need
Few changes needed4 / 5

Who it is for

Individuals and small teams who want to run their own job search site and hold the job data on their own machine.

How to start

$ sh scripts/quickstart/init-env.sh
$ docker compose up -d --build
$ docker compose run --rm --entrypoint /app/reindex app

Browse the files

Files in the product repository at the pinned commit. A few house files are left out of the zip.

File overview2,000+ paths
▸cmd367
add-board/
adzuna-liveness/
apple-revoke/
auth-cleanup/
auto-apply-orchestrate/
auto-apply/
backfill-application-events/
backfill-applications/
backfill-blank-company/
backfill-clearance/
…
▸deploy2
rollback/
▸design-system190
.gitignore
.oxlintrc.json
.storybook/
AGENTS.md
dist/
docs/
eslint.config.js
package.json
pnpm-lock.yaml
pnpm-workspace.yaml
…
▸docs128
API.internal.md
API.md
agents/
architecture.md
assets/
auth-mobile-v2-runbook.md
chatgpt-actions.md
diagrams/
features.md
google-oauth-verification.md
…
▸internal904
ai/
api/
application/
candidate/
dict/
engage/
identity/
ingest/
job/
platform/
…
▸migrations265
0001_init.sql
0002_cv_embedding.sql
0003_role_fingerprint.sql
0004_semantic_outbox.sql
0005_company_remote_regions.sql
0006_board_health.sql
0007_company_yc_facets.sql
0008_company_yc_stage_flags.sql
0009_job_daily_stats.sql
0009_user_job_analysis.sql
…
▸openspec1
config.yaml
▸perf7
k6/
lighthouse/
▸quickstart2
demo-data/
initdb/
▸scripts9
ats_boards.py
check-doc-links.mjs
check-migrations.mjs
check-shared-deps.mjs
discover_boards.py
harvest_boards.py
quickstart/
test_discover_boards.py
test_harvest_boards.py
▸services16
pii-filter/
scrapling-fetch/
▸web61
.dockerignore
.env.example
.gitignore
.oxlintrc.json
.snyk
AGENTS.md
Dockerfile
cluster.js
components.json
docker-entrypoint.sh
…
▫AGENTS.md
▫ATTRIBUTION.md
▫CODE_OF_CONDUCT.md
▫CONTRIBUTING.md
▫Dockerfile
▫LICENSE
▫LICENSE-99LL.md
▫Makefile
▫PRODUCT.md
▫QUICKSTART.md
▫README.md
▫README.upstream.md
▫SECURITY.md
▫SECURITY.upstream.md
▫delivery-manifest.txt
▫docker-compose.yml
▫go.mod
▫go.sum
▫knip.config.js
▫lefthook.yml
▫package.json
▫pnpm-lock.yaml
▫sqlc.yaml
▫Config and hidden files 25

Latest passing run

Clone → Checkout → Toolchain → Build images → Search site up and browse

Pre-purchase Disclosure

What you are buying

A self-hosted job search site: visitors can search and filter jobs, and the site already holds made-up demo companies and jobs. After running the key generation script you bring it up with Docker Compose, then run one command that builds the search index.

Derived from an open-source project under the MIT licence, and not the original project itself. Our work: a Dockerfile that builds the images from source, an orchestration file for seven services, a script that generates the keys, made-up demo data and a quick-start guide in Traditional Chinese.

Delivery is a frozen snapshot: one zip, taken from the product repository at revision 52a1428.

Known limitations

  • The services are bound to ports 8080 and 8090 of the local machine only; TLS and a reverse proxy are yours to bring
  • The demo data is made up; no real job listings or company lists are included
  • Search reads from an index, which is built by a command after start-up and must be built again after the data is deleted
  • To take in real jobs you add sources and run the crawler yourself
  • The crawler connects to outside websites, and whether that fits their terms of use is the buyer’s responsibility
  • LLM features and OAuth sign-in are off by default; turning them on needs your own service keys and accounts
  • Notification mail uses AWS SES and is off by default; turning it on means editing the orchestration file and providing AWS credentials
  • Telegram channel crawling starts with no channels; you add them yourself
  • No browser extension, command-line tool, blog, pricing page, terms page or privacy policy page is included
  • The contact address on the site is the placeholder [email protected]
  • The code carries one root certificate issued by the Russian government, used only for the connections of four Russian job sources
  • The database password takes effect only when the database is first created, and later changes to .env are not synchronised
  • The public address of the site is written in at build time, and changing the port means building the site again
  • The data lives in Docker named volumes, and docker compose down -v deletes all of it
  • The first start builds the images from source, fetching from registries, apt, package repositories and GitHub during that time
  • Pinned to the delivered snapshot; it does not follow upstream.

The liability cap, the scope of what is promised and the statutory floor are governed by the Terms of Service.

Vetting record

Everything below was checked against the pinned commit d30eb55. Every verdict carries its full reasoning, an evidence link and the checker; failures are published, not hidden — do not take our word for it, verify it yourself.

5 PASS0 WARN0 FAIL

Source ReviewPASS

Execution surface of the delivery reviewed item by item. Our own additions were read: docker-compose.yml (the published ports are bound to 127.0.0.1 only; it refuses to start when the database password, the search key or the sign-in signing key is missing; the database, search, storage and redis publish no ports; the search engine’s anonymous statistics are off; LLM, OAuth sign-in, mail sending and Telegram are off by default), scripts/quickstart/init-env.sh (openssl generates random values, .env is mode 600, existing values are not overwritten, and only the key names are printed, never the values) and quickstart/initdb/10-schema-and-demo-data.sh (on the first creation of the database it applies the table structure and loads the made-up demo data in order, and stops at the first failing step). The upstream Go and front-end sources were not read file by file; the basis is the MIT licence and container isolation.

Evidence is in our private repository (not publicly accessible):https://github.com/dev-zillio-cc/dsp-031-job-search-site/blob/52a142809013686a508ea1c903639533a9711213/docker-compose.ymlChecked in 2026Checked by claude-code build-product session
Script SafetyPASS

The scripts on the buyer’s delivery path were each inspected: init-env.sh and the database initialisation script are ours (read); the build goes through Dockerfile and web/Dockerfile (read: Go and pnpm install from lock files, system packages come from apt, and the executable of the PDF typesetting tool is downloaded from GitHub, unpacked and installed, with no download piped straight into a shell). The orchestration file starts no crawler; crawling happens only when the buyer runs the command themselves.

Evidence is in our private repository (not publicly accessible):https://github.com/dev-zillio-cc/dsp-031-job-search-site/blob/52a142809013686a508ea1c903639533a9711213/DockerfileChecked in 2026Checked by claude-code build-product session
RecencyPASS

This product is a frozen snapshot and does not follow upstream: the upstream source is pinned to the main-line revision taken on the day the product repository was created (see the evidence link), and the product repository is that snapshot plus our own commits.

Evidence ↗Checked in 2026Checked by claude-code build-product session
LicensePASS

SPDX:LicenseRef-99LL-Product

Upstream LICENSE was checked word for word (the evidence link points at the file itself at the pinned version and matches the copy inside the product repository): the standard MIT text, the copyright holders being the contributors to the upstream project. It allows commercial use, modification, derivative works, redistribution and sale; the duty is to keep the copyright notice and licence text (LICENSE and ATTRIBUTION.md ship in the zip); upstream has no NOTICE file. The decision does not rest on GitHub’s licence field. For the product as a whole the 99LL product licence template is attached: upstream’s LICENSE is kept as it is and LICENSE-99LL.md is added as the sale and liability terms for the part we built, with spdx recorded as LicenseRef-99LL-Product.

Evidence ↗Checked in 2026Checked by claude-code build-product session
Dependency LicensesPASS

This records the declared side, not a scan result: the Go dependencies are declared in go.mod and locked by go.sum, the front end is declared in package.json and locked by pnpm-lock.yaml, and the packages themselves are fetched from their own repositories when the buyer builds; the database, search engine, redis and file storage use their own official images. These dependency trees and images were not scanned package by package for licences. Upstream has no submodule and no third-party dataset was copied in (see ATTRIBUTION.md); the demo data is made-up content written by us.

Evidence is in our private repository (not publicly accessible):https://github.com/dev-zillio-cc/dsp-031-job-search-site/blob/52a142809013686a508ea1c903639533a9711213/ATTRIBUTION.mdChecked in 2026Checked by claude-code build-product session
HEALTH VERIFIED

Last verified passing: 2026-11-02

Subscribe for everything
US$49/ monthwas US$99

A subscription unlocks the whole catalogue; you do not buy this one separately.See what is included

Sign in with Google first; if you are signed out you will be sent to the sign-in page. Your subscription is billed to that same email address.

Already subscribed? This downloads straight away. Otherwise you are sent to the pricing page, or to sign in first.