npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

thinking-phrases

v2.0.0

Published

Live thinking phrases for VS Code — feeds, stocks, GitHub commits, earthquakes, weather, Hacker News, and more

Downloads

208

Readme

Thinking Phrases

Instead of staring into the abyss while Copilot thinks — contemplating how agents are going to take your job — you could be doing something useful with that dead time.

This hooks into VS Code's chat.agent.thinking.phrases and turns it into a live dashboard. A launchd cron job fetches real-time data and swaps your phrases in the background. Interactive CLI to set it up. That's it.

  • 📰 Catch up on the news — Google News, Hacker News, RSS/Atom, any feed
  • 🐙 GitHub activity — commits, org feeds, security advisories, your timeline
  • 🌦️ Get the weather — current conditions + severe alerts (lol like I go outside)
  • 📈 Watch the stock market go brrr while your agents go brrr
  • 🧠 Learn something new — VS Code tips, TypeScript snippets, programming languages
  • 🎮 Loading screen tips — WoW, League of Legends... because why not
  • 🤖 AI-powered summaries — GitHub Models rewrites articles into concise phrases

Quick start

npx thinking-phrases --interactive

No install, no clone, no config files. The interactive CLI walks you through picking sources, previewing phrases, writing to VS Code settings, and optionally installing a macOS scheduler.

Or just grab the static thinking phrases directly.

Live data sources

| Source | What it shows | Example phrase | |--------|--------------|----------------| | RSS / Atom | Any feed URL | Copilot code review now accounts for over 20% of all code reviews on GitHub, reflecting a tenfold increase in usage since its launch. — The GitHub Blog (2d ago) | | Stocks | Live ticker quotes via Yahoo Finance | BTC - USD $66,978.23 ▼ 2.02% 🟢 | | Hacker News | Top/new/best/ask/show/jobs | Multiple cursors enable simultaneous operations on syntax nodes, significantly enhancing bulk editing and refactoring capabilities. — Hacker News @ravenical 378 pts (17h ago) | | Earthquakes | USGS earthquake catalog near a ZIP | M4.2 — 12 km NE of Ridgecrest, CA — USGS (38m ago) | | Weather | Temp, humidity, wind + NWS alerts | 77°F, Mostly Cloudy, Wind E 50 mph — Fort Lauderdale, FL — Weather.gov | | Custom JSON | Any JSON API with field mapping | Article title — My API (1h ago) | | GitHub Commits | Repo or org commits with diffs | fix devtools entrypoint — vscode +1/-1 @deepak1556 (4h ago) | | GitHub Feeds | Org activity, timeline, advisories | opened a pull request in copilot-sdk — @dependabot (3m ago) |

Static phrase packs

Pre-built packs for when you just want vibes:

| Pack | Phrases | |------|---------| | VS Code tips (mac/win/linux) | 80 | | JavaScript tips | 100 | | TypeScript tips | 124 | | Ruby tips | 108 | | League of Legends loading tips | 100 | | WoW loading screen tips | 109 | | Inspirational quotes | 1,614 |

Examples

# GitHub org activity feed
npx thinking-phrases --use-github --github-mode feed --github-feed-kind organization --github-org github --github-max-items 10

# Repo commits with AI summaries
npx thinking-phrases --use-github --github-mode repo-commits --github-repo microsoft/vscode --github-max-items 5 --use-models

# Stocks + RSS
npx thinking-phrases --stocks MSFT,NVDA,TSLA --feed https://github.blog/feed/

# Earthquakes near a ZIP
npx thinking-phrases --use-earthquakes --quake-zip 94103 --quake-min-magnitude 2

# Weather conditions + alerts
npx thinking-phrases --use-weather-alerts --weather-zip 33312

# Hacker News top stories
npx thinking-phrases --use-hacker-news --hn-feed top --hn-max-items 15 --hn-min-score 100

# Custom JSON API
npx thinking-phrases --use-custom-json --json-url "https://hn.algolia.com/api/v1/search?tags=front_page" --json-items-path hits --json-title-field title

# Dry run (preview only, don't write)
npx thinking-phrases --dry-run --stocks MSFT,NVDA --use-hacker-news

Install

# Just run it (no install needed)
npx thinking-phrases --interactive

# Or install globally
npm install -g thinking-phrases
thinking-phrases --interactive

# Or clone for development
git clone https://github.com/austenstone/thinking-phrases.git
cd thinking-phrases
npm install
npm run start:interactive

Data source config

Each source can be configured via CLI flags, config files, or the interactive CLI. Here's what each one looks like in a config file:

Any feed URL. Google News, GitHub Blog, Ars Technica, your company blog — whatever. When AI is enabled, full article HTML is fetched for richer summaries.

"feeds": [
  { "url": "https://github.blog/feed/" },
  { "url": "https://news.google.com/rss/headlines/section/topic/TECHNOLOGY?hl=en-US&gl=US&ceid=US:en" }
]

Default refresh: every 6 hours.

Live prices via Yahoo Finance. Pre-market, after-hours, closed labels.

"stockQuotes": {
  "enabled": true,
  "symbols": ["MSFT", "NVDA", "TSLA", "AMZN", "GOOGL", "AMD"],
  "includeMarketState": true,
  "showClosed": false,
  "fetchIntervalSeconds": 60
}

Top, new, best, ask, show, or jobs feed. Configurable minimum score.

"hackerNews": {
  "enabled": true,
  "feed": "top",
  "maxItems": 10,
  "minScore": 50,
  "fetchIntervalSeconds": 300
}

Enter a ZIP code or place name → resolves to lat/lon → queries USGS within a radius.

"earthquakes": {
  "enabled": true,
  "zipCode": "94103",
  "minMagnitude": 2,
  "radiusKm": 500,
  "windowHours": 24,
  "limit": 10,
  "orderBy": "time",
  "fetchIntervalSeconds": 1800
}

Current conditions (temp, humidity, wind, description) + active severe weather alerts. Auto-detects location in interactive mode.

"weatherAlerts": {
  "enabled": true,
  "zipCode": "33312",
  "area": "FL",
  "minimumSeverity": "moderate",
  "limit": 10,
  "fetchIntervalSeconds": 1800
}

Severity levels: minor, moderate, severe, extreme.

Point at any JSON endpoint and map the fields. Multiple sources supported via customJsonSources[].

"customJson": {
  "enabled": true,
  "url": "https://hn.algolia.com/api/v1/search?tags=front_page",
  "itemsPath": "hits",
  "titleField": "title",
  "contentField": "summary",
  "linkField": "url",
  "sourceLabel": "HN API",
  "dateField": "created_at",
  "idField": "objectID",
  "maxItems": 10,
  "fetchIntervalSeconds": 3600
}

Three modes: repo-commits (recent commits with diffs), org-commits (push events across an org), and feed (Atom feeds — org activity, timeline, security advisories, etc.).

"githubActivity": {
  "enabled": true,
  "mode": "repo-commits",
  "repo": "microsoft/vscode",
  "branch": "main",
  "maxItems": 10,
  "sinceHours": 24,
  "tokenEnvVar": "GITHUB_TOKEN",
  "fetchIntervalSeconds": 300
}

Feed kinds: timeline, current-user-public, current-user, current-user-actor, security-advisories, organization, custom-url.

AI-powered formatting

Enable GitHub Models and each article gets individually rewritten by AI into a concise phrase. Works with gpt-4o-mini, gpt-5, o3, or any OpenAI-compatible model. Source attribution (— Source (time)) is appended automatically — the model just focuses on content.

Results are cached per-article (7-day TTL) so re-runs don't burn tokens. Falls back to template formatting if auth or inference fails.

"githubModels": {
  "enabled": true,
  "model": "openai/gpt-4o-mini",
  "fetchArticleContent": true
}

Auth resolves in order: GITHUB_MODELS_TOKENGITHUB_TOKENgh auth token.

Phrase format

Customizable templates with %variable% substitution. The engine auto-strips empty brackets and collapses whitespace.

"phraseFormatting": {
  "includeSource": true,
  "includeTime": true,
  "maxLength": 140,
  "templates": {
    "article": "%title% — %source% (%time%)",
    "hackerNews": "%title% — HN %score% (%time%)",
    "stock": "%symbol% %price% %change% %market%",
    "githubCommit": "%headline% — %repo% %delta% @%author% (%time%)",
    "githubFeed": "%action% — @%handle% (%time%)"
  }
}

Presets

The interactive CLI includes presets to get started fast:

| Preset | What you get | |--------|-------------| | Dev Pulse | Google Tech news + Hacker News top stories | | Market Watch | MSFT, NVDA, AMZN, GOOGL, AMD, TSLA stock quotes | | World Signals | Earthquakes (M4.5+) + severe weather + Hacker News best |

Scheduler (macOS)

A launchd job that refreshes phrases in the background. The interactive CLI can set this up, or do it manually:

npm run schedule             # every 1 hour (default)
npm run schedule -- 300      # every 5 minutes
npm run schedule:trigger     # run now
npm run schedule:remove      # remove it

Also available via CLI flags: --install-scheduler, --trigger-scheduler-now, --uninstall-scheduler.

Static packs

VS Code tips

| Category | Count | Description | |----------|-------|-------------| | ⌨️ Shortcuts | 25 | Multi-cursor, navigation, selection, formatting | | 🤖 Copilot | 15 | Chat, agent mode, inline chat, prompt files | | 🔀 Git | 8 | Source control, blame, staging, timeline | | 💻 Terminal | 7 | Splits, suggestions, integrated terminal | | 🐛 Debugging | 7 | Breakpoints, logpoints, conditional stops | | ✏️ Editor | 10 | Zen mode, sticky scroll, Emmet | | 😄 Funny | 8 | Flavor text |

OS-aware format — each tip has mac, windows, and linux variants:

{
  "mac": "⌘+D selects the next occurrence of a word. Keep pressing for more!",
  "windows": "Ctrl+D selects the next occurrence of a word. Keep pressing for more!",
  "linux": "Ctrl+D selects the next occurrence of a word. Keep pressing for more!"
}

Other packs

Standalone string arrays — just drop them in:

  • JavaScript tips (100)
  • TypeScript tips (124)
  • Ruby tips (108)
  • League of Legends loading tips (100)
  • WoW loading screen tips (109)
  • Inspirational quotes (1,614 — from dwyl/quotes, GPL-2.0)

Install a static pack directly:

npx thinking-phrases --static-pack out/typescript-tips.json

CLI reference

Commands

| Command | Description | |---------|-------------| | npx thinking-phrases --interactive | Guided interactive setup | | npx thinking-phrases --dry-run | Preview phrases without writing | | npx thinking-phrases | Write phrases to VS Code settings | | npx thinking-phrases --uninstall | Remove thinking phrases from settings | | npx thinking-phrases --static-pack <path> | Install a static phrase pack |

Global flags

| Flag | Description | |------|-------------| | --config <path> | Load a saved config file | | --settings <path> | Custom VS Code settings.json path | | --dry-run | Preview phrases without writing to settings | | --verbose | Verbose output | | --debug | Debug output (includes verbose) | | --limit <num> | Max total phrases (default: 100) | | --mode append\|replace | Append to or replace existing phrases | | --target auto\|insiders\|stable | Which VS Code edition to target | | --max-length <num> | Max phrase length in characters (default: 140) | | --no-source | Omit source attribution from phrases | | --no-time | Omit relative time from phrases |

Source flags

| Flag | Description | |------|-------------| | --feed <url> | Add an RSS/Atom feed URL (repeatable) | | --use-stocks / --no-stocks | Enable/disable stock quotes | | --stocks <SYMBOLS> | Comma-separated stock tickers | | --use-hacker-news | Enable Hacker News | | --hn-feed <type> | top, new, best, ask, show, or jobs | | --hn-max-items <num> | Max HN items | | --hn-min-score <num> | Minimum HN score filter | | --use-earthquakes | Enable earthquake source | | --quake-zip <zip> | ZIP code for earthquake search center | | --quake-place <name> | Place name for earthquake search | | --quake-min-magnitude <num> | Minimum magnitude filter | | --quake-radius-km <num> | Search radius in km | | --quake-hours <num> | Time window in hours | | --quake-order time\|magnitude | Sort order | | --quake-limit <num> | Max earthquake results | | --use-weather-alerts | Enable weather source | | --weather-zip <zip> | ZIP code for weather | | --weather-area <area> | US state code (e.g. FL) | | --weather-severity <level> | Minimum severity (minor/moderate/severe/extreme) | | --weather-limit <num> | Max weather alert results | | --use-custom-json | Enable custom JSON source | | --json-url <url> | JSON endpoint URL | | --json-items-path <path> | JSONPath to items array | | --json-title-field <field> | Field name for title | | --json-content-field <field> | Field name for content | | --json-link-field <field> | Field name for link | | --json-source-field <field> | Field name for source | | --json-source-label <label> | Fallback source label | | --json-date-field <field> | Field name for date | | --json-id-field <field> | Field name for ID | | --json-max-items <num> | Max JSON items | | --use-github | Enable GitHub activity | | --github-mode <mode> | repo-commits, org-commits, or feed | | --github-repo <owner/repo> | Target repository | | --github-org <org> | Target organization | | --github-branch <branch> | Branch filter | | --github-feed-kind <kind> | Feed type (see GitHub activity section) | | --github-feed-url <url> | Custom feed URL | | --github-max-items <num> | Max GitHub items | | --github-since-hours <num> | Lookback window in hours | | --github-token-env <var> | Env var name for GitHub token |

AI model flags

| Flag | Description | |------|-------------| | --use-models / --no-models | Enable/disable AI rewriting | | --model <name> | Model ID (default: openai/gpt-4o-mini) | | --models-endpoint <url> | Inference endpoint | | --models-token-env <var> | Env var for model auth token | | --models-max-concurrency <num> | Parallel inference requests | | --models-max-input-items <num> | Max articles sent to model | | --models-max-input-tokens <num> | Max input token budget | | --models-max-tokens <num> | Max output tokens per request | | --models-max-phrases-per-article <num> | Phrases generated per article | | --models-temperature <0-1> | Sampling temperature | | --fetch-article-content / --no-fetch-article-content | Fetch full article HTML for AI | | --max-article-content-length <num> | Max chars of article body sent to model |

Scheduler flags

| Flag | Description | |------|-------------| | --install-scheduler | Install/update macOS launchd job | | --trigger-scheduler-now | Trigger the scheduler immediately | | --uninstall-scheduler | Remove the launchd job |

How it works

Sources → Normalize → Format → Cache → Write
  1. Sources fetch live data (RSS, stocks, GitHub, USGS, NOAA, JSON APIs) — each respects its own refresh interval
  2. Core normalizes everything into ArticleItem or StockItem objects
  3. Formatter builds display phrases from customizable templates — content first, source/metadata suffix appended
  4. AI (optional) rewrites phrases via GitHub Models, with per-article caching to avoid redundant inference
  5. Phrase store persists phrases per-source in ~/.cache/thinking-phrases/ so different refresh intervals don't clobber each other
  6. Sink writes the merged phrases into VS Code settings.json using jsonc-parser (preserves comments and formatting)

The source catalog is modular. Each source is a { type, isEnabled, fetch } object registered in the catalog. Adding a new source means writing one file and registering it.

Portability

Settings path auto-detection works on macOS, Linux, and Windows. Supports both VS Code Stable and Insiders. You can also pass --settings to point at any path or --target to force a specific edition.

References

License

MIT