Monitors Hacker News for user-configured keywords, deduplicates against a local SQLite cache, and sends Slack alerts for new matching posts. Use when asked to monitor Hacker News for mentions, track keywords on HN, get alerts when something is posted about a topic on Hacker News, or set up HN keyword monitoring. Trigger when a user mentions Hacker News alerts, HN monitoring, keyword tracking on HN, or wants to know when a topic appears on Hacker News.
npx skills add https://github.com/Varnan-Tech/opendirectory --skill hackernews-intel
Monitor Hacker News for keywords. On each run, fetch new posts via the HN Algolia API, deduplicate against a local SQLite cache, and send Slack alerts for unseen matches. Run manually or schedule via cron or GitHub Actions.
1a. Verify required environment variables
Check that these are set:
HN_KEYWORDS (required): comma-separated list of keywords to monitorSLACK_WEBHOOK (required): Slack Incoming Webhook URL for alertsIf either is missing, stop and tell the user:
HN_KEYWORDS: list the topics you want to monitor, comma-separated. Example: claude code,LLM agents,deno runtimeSLACK_WEBHOOK: create an Incoming Webhook at https://api.slack.com/apps. Select your workspace, enable Incoming Webhooks, and copy the URL.1b. Verify script dependencies
ls /Users/ksd/Desktop/Varnan_skills/hackernews-intel/node_modules/better-sqlite3 2>/dev/null
If missing:
cd /Users/ksd/Desktop/Varnan_skills/hackernews-intel && npm install
cd /Users/ksd/Desktop/Varnan_skills/hackernews-intel && node scripts/monitor-hn.js
Flags:
--dry-run: print matches to stdout without sending any Slack alerts. Use this to preview what would be alerted before committing.--days=N: on the first run, look back N days (default: 1). Only applies when the SQLite cache is empty.--reset: clear the cache and start fresh. Use when you change your keyword list significantly.What the script does:
HN_KEYWORDS from environment, splits by comma, trims whitespaceHN_DB_PATH (default: ./hn-intel.db)https://hn.algolia.com/api/v1/search_by_date with numericFilters=created_at_i>lastSeenobjectID is already in seen_posts — skips if yesHN_MIN_POINTS is set, skips posts below that thresholdobjectID into the cachepoll_log with the run summaryAfter the script runs, read its stdout output. It will report:
Run complete.
Keywords checked: N
Posts found: N
Posts alerted: N
Posts skipped (already seen): N
Errors: N
If Posts found: 0 and you expect results, check:
--days window large enough for the first run? Try --days=7--reset to clear it and rerunIf Posts alerted: 0 but Posts found: N, the deduplication is working — those posts were seen in a previous run.
Option A: cron (macOS/Linux)
Add to crontab to run every 4 hours:
crontab -e
Add this line (adjust the path to match your install):
0 */4 * * * cd /Users/ksd/Desktop/Varnan_skills/hackernews-intel && node scripts/monitor-hn.js >> /tmp/hn-intel.log 2>&1
Option B: GitHub Actions (recommended for teams)
Create .github/workflows/hn-intel.yml in any repo:
name: HN Intel Monitor
on:
schedule:
- cron: '0 */4 * * *'
workflow_dispatch:
jobs:
monitor:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
run: npm install
working-directory: hackernews-intel
- name: Run monitor
run: node scripts/monitor-hn.js
working-directory: hackernews-intel
env:
HN_KEYWORDS: ${{ secrets.HN_KEYWORDS }}
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
HN_MIN_POINTS: ${{ secrets.HN_MIN_POINTS }}
Add HN_KEYWORDS, SLACK_WEBHOOK, and optionally HN_MIN_POINTS as repository secrets.
Note: GitHub Actions does not persist files between runs, so the SQLite cache resets each run. This means every run will find all posts within the default 1-day lookback window again. For persistent dedup on GitHub Actions, store the DB in a persistent location (S3, artifact cache, or a dedicated branch).
Adding or changing keywords:
Update HN_KEYWORDS in your .env or environment. No restart needed — the script reads it fresh each run.
Setting a minimum points threshold:
Set HN_MIN_POINTS=10 to only alert on posts with 10 or more points. This cuts noise for broad keywords.
Including comments (not just stories):
Set HN_INCLUDE_COMMENTS=true to also monitor comments mentioning the keyword. Off by default — comments generate significantly more volume.
Resetting the cache:
Run node scripts/monitor-hn.js --reset to clear seen_posts and poll_log. The next run fetches fresh from the lookback window.
Testing a new keyword:
Run node scripts/monitor-hn.js --dry-run --days=7 to see the last 7 days of matching posts without alerting anyone.
Check whether ClickHouse's supported versions (last 3 majors + latest LTS) have recent stable patch releases, diagnose why the scheduled AutoReleases pipeline failed, and identify which releases must be created manually. Use when asked "are the patch releases up to date", "why did autorelease fail", "which releases are missing", "did a release get skipped", during the bi-weekly release-health check, or when investigating create_release.yml / auto_releases.yml failures. Reproduces the full investigation: supported versions from SECURITY.md, per-version staleness, classification of the last N days of AutoReleases/CreateRelease failures (version-bump-PR guard vs missing release-maker runner vs other), the Slack cross-check that reveals the blocking PR, and gated remediation (close a stale robot bump PR, dispatch CreateRelease for a missing version).
Deep-scan any tools you connect (CRM, email, support, reviews, analytics, billing, database) to produce a data-grounded Ideal Customer Profile and a reusable persona library. Read-only by default. Use when you need to define or refresh your ICP, build buyer personas from real data instead of guesses, or generate the persona inputs that the customer-panel-of-experts and prospect-panel-simulator skills consume.
Initialize a project_brain.db in the current project folder. Creates the database, project record, then scans existing files (CLAUDE.local.md, memory files, docs, emails) to bootstrap the brain with knowledge. Smart enough to handle re-runs — skips what already exists and only processes new/changed files.
Expert in background job processing with Bull/BullMQ (Redis), Celery, and cloud queues. Implements retries, scheduling, priority queues, and worker management. Use for async task processing, email campaigns, report generation, batch operations. Activate on "background job", "async task", "queue", "worker", "BullMQ", "Celery". NOT for real-time WebSocket communication, synchronous API calls, or simple setTimeout operations.
>- Distributed traces, spans, service dependencies, and request flow analysis. Use when investigating span-level details, failures, performance bottlenecks, or trace correlation. "distributed trace", "span details", "HTTP status codes in traces", "database query spans", "messaging spans", "gRPC calls", "Lambda cold starts", "trace ID lookup", "exception analysis", "correlate logs and traces", "request attributes". Do NOT use for explaining existing queries, product documentation or configuration questions, service-level RED metrics (use dt-obs-services), log searching (use dt-obs-logs), or problem analysis (use dt-obs-problems).
Clerk webhooks for real-time events and data syncing. Verify with verifyWebhook from the framework-specific package. Handle user, session, organization, billing, and payment events. Build event-driven features like database sync, notifications, and integrations.
Handles backend/API/database work for Unite-Hub. Implements Next.js API routes, Supabase database operations, RLS policies, authentication, and third-party integrations (Gmail, Stripe).
Manage Things 3 via the `things` CLI on macOS (add/update projects+todos via URL scheme; read/search/list from the local Things database). Use when a user asks OpenClaw to add a task to Things, list inbox/today/upcoming, search tasks, or inspect projects/areas/tags.
Take varnan-tech/hackernews-intel from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference npm.
Without those the skill loads but fails at the first command.