Only Hiring について
Only Hiringは、Redditの求人サブレディットで仕事を探す人向けの求人掲示板です。求人と判定された投稿を、項目別情報や詐欺スコア、元投稿へのリンクとともに掲載します。
主な機能
- 01Redditの求人サブレディットを集約
- 02給与、職種、勤務地、スキルを表示
- 03詐欺スコアと警告を表示
- 04絞り込み、検索、並べ替え
- 05任意のアカウントで応募状況を記録
活用シーン
- 01Redditでリモートや契約の仕事を探す
- 02スキル、勤務地、給与で求人を絞る
- 03警告を確認して元投稿から応募する
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://onlyhiring.hassandev.me/mcpclaude mcp add --transport http hassanaziz0012-only-hiring https://onlyhiring.hassandev.me/mcp{"mcpServers":{"hassanaziz0012-only-hiring":{"type":"http","url":"https://onlyhiring.hassandev.me/mcp"}}}Cursor で開く{"servers":{"hassanaziz0012-only-hiring":{"type":"http","url":"https://onlyhiring.hassandev.me/mcp"}}}VS Code で開く{"mcpServers":{"hassanaziz0012-only-hiring":{"type":"http","url":"https://onlyhiring.hassandev.me/mcp"}}}{"mcpServers":{"hassanaziz0012-only-hiring":{"serverUrl":"https://onlyhiring.hassandev.me/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
採用情報のみ
Redditの採用サブレディットから、ノイズを除いた求人掲示板です。
r/forhire、r/slavelabour、r/DesignJobsなどのサブレディットでは、投稿の約4分の3が自分のサービスの宣伝、議論、またはスパムです。このサイトには、実際に人を採用している投稿だけが掲載されます。各求人には短い概要、構造化された項目(報酬、職種、勤務形態、勤務地、スキル)、および応募先となる元のReddit投稿へのリンクがあります。
仕組み
[private pipeline (not in this repo)]
scrape new posts → grade each post with a language model → sync to Postgres
│ writes
▼
Neon Postgres, `jobs` table
▲ reads only
│
[this repo, on Vercel] Next.js reads the table server-side and renders the list
- 収集。 定期的に、パイプラインが約19の採用サブレディットから最新の投稿を読み込みます。
[For Hire]または[Offer]のタグが付いた投稿は除外されます。 - 評価。 言語モデルが各投稿について、採用募集かどうかを判断し、概要を作成して、報酬、スキル、勤務地を抽出し、0から1までの詐欺スコアを付けます。
- 公開。 採用投稿のみがデータベースに書き込まれます。各投稿本文は冒頭部分(約320文字)のみ保存され、サイトでは独自の概要を表示し、残りはRedditへのリンクで案内します。Redditの投稿が削除または除去された求人は、掲示板から取り下げられます。
スクレイパーと評価システムは、このリポジトリには含まれていません。 別の非公開パイプラインが定期的に投稿を収集・評価し、データベースに書き込みます。このリポジトリに含まれるのはウェブサイトのみで、データベースから読み取る処理だけを行います。
プロダクトのルール
| ルール | 値 | 場所 |
|---|---|---|
| この日数を超えた求人は、折りたたまれた「古い投稿」セクションに移動します | 14 days | src/lib/site.ts |
| この詐欺スコア以上の求人は、デフォルトで非表示になります | 0.6 | src/lib/site.ts |
| この詐欺スコア以上の求人には、警告が表示されます | 0.4 | src/lib/site.ts |
| リスト、件数、統計情報の更新 | 同期のたびに(refresh.sh)、それ以外は毎日 | src/lib/db.ts(cacheLife) |
| 求人ページの更新 | 同期によって求人が追加、変更、削除されたとき、および期限切れ時。それ以外は毎月 | src/lib/db.ts(getJob) |
データセットが小さいため、フィルタリング、検索、並べ替えはブラウザーで行います。フィルターはURLに保持されるため、フィルター適用済みの表示を共有できます。「応募済み」のマークは、訪問者のlocalStorageか、サインインしている場合はアカウントに保存されます。アカウントは任意です(better-authを介したメールアドレスとパスワード、またはGoogle)。サインインすると、ブラウザー内のマークがアカウントに統合されます。サインアウト中の訪問者が求人にマークを付けるか、Redditの投稿を開くと、アカウントの作成が一度だけ案内されます。案内を閉じた場合、その後14日間は再表示されません。
ローカルでの実行
必要なもの:Node 20 以降と npm。
npm install
cp .env.example .env.local # then set WEB_DATABASE_URL (and optionally REMOVAL_EMAIL)
npm run dev
WEB_DATABASE_URL は、jobs テーブルに対する SELECT のみが許可されたロール用の Postgres 接続文字列です。
DATABASE_URL は、アカウントと応募済みマーク用の、別個の 2 つ目の Postgres データベースです。db/schema.sql でテーブルを作成してください。BETTER_AUTH_SECRET はセッション Cookie に署名します(openssl rand -base64 32)。
GOOGLE_CLIENT_ID と GOOGLE_CLIENT_SECRET は任意です。設定すると、「Google で続行」が有効になります。これらは Google Cloud Console で種類が「Web アプリケーション」の OAuth クライアントから取得します。承認済みのリダイレクト URI として https://<your domain>/api/auth/callback/google を指定してください(ローカルで使用する場合は http://localhost:3000/... も追加してください)。ボタンは、ビルド時に両方が設定されている場合にのみ表示されます。
REMOVAL_EMAIL は任意の設定です。フッターと About ページに表示される削除リクエスト用のメールアドレスです。ビルド時にサーバーで読み込まれます。設定されていない場合、サイトは代わりにこのリポジトリの Issue トラッカーへリンクします。
RESEND_API_KEY は任意です。ヘッダーのフィードバックダイアログから送信された各メッセージを、Resend で認証済みのドメインから [email protected] を送信元として、REMOVAL_EMAIL にメールで送ります。メッセージはアカウント用データベースの feedback テーブルにも保存されるため、メール送信に失敗しても内容が失われることはありません(emailed は false のままです)。各 IP アドレスからは 1 時間に 5 件送信できます。
Vercel では、プロジェクトの環境変数にこれらを設定し、Production と Preview の両方に適用してください。
データベースに接続できなくてもサイトはビルドされ、「求人リストを読み込めませんでした」という状態を表示した後、毎分再試行します。
その他のスクリプト:npm run build、npm run start、npm run lint。
npm run dev と npm run build は、最初に scripts/fetch-fonts.mjs を実行し、Fontshare から Pilcrow Rounded のフォントファイルをダウンロードして src/app/fonts/ に保存します。このフォルダーは意図的に gitignore されています。詳しくはライセンスをご覧ください。
コードマップ
src/
app/
page.tsx home: masthead + job board (server component)
jobs/[id]/page.tsx job detail, prerendered for every job
about/page.tsx how it works, scam scores, limits, removal requests
robots.ts, sitemap.ts, opengraph-image.tsx, icon.svg
components/
account/ sign-in dialog, header link, session sync
FeedbackNav.tsx header Feedback link and dialog (posts to app/api/feedback)
board/ client-side filters, search, sorting, grouping
JobItem.tsx one job in the list
JobDetail.tsx the detail view
lib/
db.ts the only database code (server-only, cached)
jobs.ts row type, defensive parsing, expiry and scam rules
labels.ts human labels for enum-like columns
format.ts pay, date and time formatting
applied.ts the "applied" store: localStorage, or the account when signed in
auth.ts better-auth config and the accounts database (server-only)
site.ts site name, thresholds, removal contact
このアプリは、Cache Components を有効にした Next.js 16(cacheComponents: true)を使用しているため、キャッシュには export const revalidate ではなく、"use cache" と cacheLife を使用します。
各同期の後、パイプラインは refresh.sh を実行し、同期によって追加、変更、または削除された求人を(パイプラインの last_sync.json から)/api/revalidate に送信します。再ビルドされるのは該当する求人ページのみです。再ビルドのたびに、ページ、そのプリフェッチ用セグメント、および画像が Vercel の ISR キャッシュに書き込まれます。Hobby プランでは、月あたり 200,000 回の書き込みが許可されています。デプロイ時にはいずれにしてもキャッシュが新しくなります。パイプライン外でデータベースを手動編集するなどして求人を変更した後、すべての求人ページを再ビルドするには、./refresh.sh --all を実行してください。
デザインの方向性
モチーフはひとつ、角括弧です。 採用関連のサブレディットでは、実際の求人投稿のタイトルの先頭に [Hiring] と付けます。この角括弧がサイトで使う唯一の形で、次の4か所に登場します。
- 名前の
only [hiring]。 - 見出し。ページの読み込み時に、大きな角括弧2つで「タグ付け」されます。クリックなしで再生されるアニメーションは、ページ内でこれだけです。
- すべての求人の経過時間。左側の余白に
[3h]のような角括弧付きタグで表示されます。 - 選択中のフィルター。投稿タイトルと同じように角括弧で囲まれます。
色。 使う色は1組で、それぞれの色に意味をひとつだけ持たせています。ミントは残したもの(マストヘッド、選択中のフィルター、応募パネル)を表します。ピンクは注意を促すもの(詐欺の警告、非表示にした詐欺に関する注記、応募前に投稿を確認するよう促すフッター)を表します。深緑は操作要素だけに使います。それ以外は、ほぼ白の背景とほぼ黒の文字で構成し、線や影ではなく色調の違いで面を区切ります。ダークモードでも深い緑がかった黒の中で同じ役割を保ち、prefers-color-scheme に従います。
書体。 Indian Type Foundry による Pilcrow Rounded を1種類だけセルフホストしています。見出しには太字・詰め気味・小文字で使い、本文にはレギュラーウェイトを使います。サイズは小、本文、リード、見出し、ディスプレイの5種類だけです。
レイアウト。 リストはメニューのように表示します。日付の見出しに件数を付け、求人タイトルを左側に、給与を同じ行の右側に価格のように配置します。カード、枠線、影はありません。デスクトップではフィルターを固定表示のレールに配置します。スマートフォンでは、固定表示の検索バーからボトムシートとして開きます。
動き。 トグル、フィルターシート、選択時の角括弧など、訪問者の操作に応じて動きます。すべて prefers-reduced-motion を尊重します。
アートディレクションは、デザインスキルの frontend-design と taste-skill を使って決定しました。新しい制作物もこのルールに沿ってください。別の形や3つ目の色、2種類目の書体、装飾的な動きを追加しないでください。
既知の制限事項
- 削除された投稿は、次回のパイプライン実行まで残ります。 各実行では過去14日間の求人を再確認し、対応する Reddit の投稿が削除または削除扱いになっている場合は、求人を取り除きます。それより古い求人は再確認されないため、リンクが無効になることがあります。
- 給与は換算されません。 金額は投稿に記載された通貨のままです。給与で並べ替える場合は、異なる通貨を比較せず、給与の種類と通貨ごとに求人をまとめます。
- 評価が間違っていることがあります。 要約、項目、詐欺スコアは言語モデルによって生成されます。サイトではそのことを明記し、訪問者に Reddit の投稿を確認するよう求めています。
法務情報
このプロジェクトは Reddit, Inc. と提携、承認、後援されていません。Reddit は Reddit, Inc. の商標です。各 Reddit 投稿の冒頭部分のみを保存して表示しており、すべての求人情報から元の投稿にリンクしています。削除依頼の連絡先はサイトのフッターに記載されています。
ライセンス
コードは MIT ライセンスの下で公開されています。
書体の Pilcrow Rounded は MIT の対象ではありません。Indian Type Foundry に帰属し、ITF Free Font License の下でライセンスされています。このライセンスでは、自分のサイトでのセルフホストは許可されていますが、フォントファイルの再配布は禁止されています。そのため、ファイルはこのリポジトリに含まれていません。ビルド時に Fontshare から各自のコピーを取得し、そのコピーにも同じライセンスが適用されます。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。