- Rust 82.3%
- Shell 11.5%
- Astro 2%
- Nix 1.3%
- JavaScript 1.3%
- Other 1.6%
Release notes were written by hand on GitHub at tag time, so the contents of a stacked release had to be pieced together from every PR, and output changes that scripts and agents rely on were easy to miss. - CHANGELOG.md backfills every published release (0.2.0 to 0.4.0) from its GitHub notes, verbatim. - A PR adds changes/unreleased/<branch-name>.md instead of editing CHANGELOG.md, so stacked PRs never conflict. changes/README.md gives the sections, including Output Changes for JSON, MCP and error-code changes. - scripts/changelog.sh: `check` validates entries and CHANGELOG.md, `release X.Y.Z` folds the entries into a new section (ordered by PR), and `notes X.Y.Z` prints a section as GitHub release notes. - The release workflow sets the GitHub notes from the tag's section. - New flake check `changelog` runs scripts/changelog-test.sh; both scripts are shellchecked. - Entries for 0.5.0: #73, #74, #75, #78, #79, #80, #81 and this PR. Claude-Session: https://claude.ai/code/session_01RqPPVeVDrnLoP7NUZmLRxY |
||
|---|---|---|
| .agents | ||
| .codex/skills/idx-release | ||
| .github/workflows | ||
| changes | ||
| contrib/systemd | ||
| crates | ||
| docs | ||
| npm/idx-mcp | ||
| scripts | ||
| tests/agents | ||
| web | ||
| .envrc | ||
| .gitignore | ||
| .pre-commit-config.yaml | ||
| AGENTS.md | ||
| Cargo.lock | ||
| Cargo.toml | ||
| CHANGELOG.md | ||
| flake.lock | ||
| flake.nix | ||
| install.sh | ||
| LICENSE | ||
| package.json | ||
| README.md | ||
| ROADMAP.md | ||
idx-cli
CLI tool for Indonesian stock market (IDX) analysis, built in Rust for humans and AI agents.
Installation
Install script (Linux, macOS)
curl -fsSL https://raw.githubusercontent.com/0xrsydn/idx-cli/main/install.sh | sh
Downloads the prebuilt idx binary for your platform from GitHub Releases,
verifies it against the release SHA256SUMS, and installs it into
~/.local/bin without sudo. Pin a version or change the directory with
sh -s -- --version v0.5.0 --dir ~/bin. See docs/INSTALL.md.
npm / npx
npx idx-cli --help # run without installing
npm install --global idx-cli
The npm package downloads the same checksum-verified release binary during
postinstall, or on first run when the package manager skips install scripts
(npm 12 under npx, pnpm 10+, bun). See
docs/NPM_DISTRIBUTION.md.
Prebuilt binaries cover Linux x64/arm64 (static musl) and macOS arm64/x64. On Windows, use WSL.
Nix
nix run github:0xrsydn/idx-cli -- version
nix profile install github:0xrsydn/idx-cli#default
The Nix package wraps idx with curl-impersonate and mupdf, so every
helper tool below is available automatically.
Cargo
cargo install idx-cli
Builds from source; requires Rust 1.89+.
Runtime helper tools
The install script, npm, and Cargo installs ship only the idx binary. A few
commands call external tools:
| Tool | Needed for |
|---|---|
curl_chrome* from curl-impersonate (ownership also tries its Firefox and Safari profiles), or IDX_CURL_IMPERSONATE_BIN |
ownership discover / import --url from IDX (behind Cloudflare), and Yahoo fundamentals when IDX_PROVIDER=yahoo |
mutool from MuPDF |
importing legacy PDF ownership reports only |
Everyday use (stocks with the default MSN provider, including history,
ownership sync, and every local ownership query) needs neither.
Quick start
# Stocks
idx stocks quote BBCA
idx stocks quote BBCA,BBRI,BMRI
idx stocks history BBCA --period 3mo
idx stocks technical BBCA
idx stocks fundamental BBCA
idx stocks compare BBCA BBRI BMRI
idx -o json stocks quote BBCA
# Ownership: download the maintained snapshot once, then query locally
idx ownership sync
idx ownership ticker BBCA
idx ownership entity "ANTHONI SALIM"
idx ownership search salim
idx ownership changes --from 2026-07-31 --to 2026-08-31
Features
Stocks
- Quotes, OHLC history, company profile, financial statements, earnings, news, crowd sentiment, and AI insights
- Analysis:
technical,growth,valuation,risk, and a combinedfundamentalreport; multi-symbolcompare; MSN stockscreen - Providers: MSN is the default for quotes, fundamentals, and screening;
Yahoo serves history. Switch with
IDX_PROVIDER=msn|yahooandIDX_HISTORY_PROVIDER=auto|yahoo|msn - Local file cache with TTL, and
--offlinemode with stale-cache fallback
Ownership (KSEI shareholders above 1%)
- Source: the monthly KSEI holder register ("Pemegang Saham di Atas 1%") published by IDX. Since June 2026 it is an XLSX file on IDX's Data Kepemilikan Saham page; earlier months were PDF announcements
ownership syncinstalls a maintained SQLite snapshot (checked daily, currently the latest three months), after which every query runs offline- Queries: holders per
ticker, holdings perentity, entitysearch, month-over-monthchanges,concentration,cross-holders, and an ownershipgraph - Self-serve ingest:
ownership discoverfinds the latest reports, andownership import --url <xlsx-or-pdf>/--fileloads them into your local database. See docs/OWNERSHIP_SYNC.md
Output
- Tables when you run idx in a terminal; compact JSON when its output is piped or captured, so scripts and AI agents get structured data with no flag
-o table|json|jsonl(orIDX_OUTPUT, orgeneral.outputin the config) overrides that;jsonlprints one array item per line- Errors go to stderr, as one JSON object in JSON modes
Configuration
Config file location:
~/.config/idx/config.toml
You can configure using:
- Config file (
idx config init,idx config set) - Environment variables
- CLI flags
Precedence order:
- CLI flags
- Environment variables
- Config file
- Built-in defaults
Scripting and agents
idx composes with jq, Python, and other shell tools:
idx stocks quote BBCA BBRI | jq -r '.[] | "\(.symbol) \(.price)"'
idx -o jsonl stocks history BBCA --period 1y | tail -5
idx stocks screen --filter high-dividend | jq -r '.[].symbol' | idx stocks compare -
- stdout carries only data; warnings and errors go to stderr
-reads symbols from stdin forstocks quoteandstocks compare- No color codes when output is not a terminal
- Exit codes:
0success,2invalid input or config,3not found or no cached data,4upstream unavailable (retry later),5unsupported,1other idx completions <shell>generates shell completions
If you ran idx config init before v0.3, your config pins output = "table";
change it to auto with idx config set general.output auto.
MCP server
idx-mcp serves the same data to MCP clients over stdio, as 14 tools:
get_quotes, get_price_history, screen_stocks, get_company,
analyze_stock, compare_stocks, get_broker_summary, analyze_bandar,
get_foreign_flow, get_shareholders, get_investor_holdings,
search_investors, get_ownership_changes, and ownership_status. Live results come wrapped as
{data, source, fetched_at, stale}; errors use the CLI's {error, code, message} body. It shares idx's config, cache, and ownership database.
Install it like idx (npm, Cargo, or Nix), then register it with your MCP
client:
claude mcp add idx -- npx -y idx-mcp # Claude Code, via npm
cargo install idx-mcp # or build it (Rust 1.89+)
nix profile install github:0xrsydn/idx-cli#idx-mcp
Other clients run the idx-mcp command over stdio.
Ownership tools need a populated database: run idx ownership sync once, or
start the server with idx-mcp --allow-sync to expose an ownership_sync
tool (it downloads several MB).
Documentation
User docs, MCP setup per agent, and agent-readable llms.txt:
https://idx.rasyidanaf.com. Maintainer docs:
- docs/INSTALL.md: install script options
- docs/NPM_DISTRIBUTION.md: npm package and release flow
- docs/ARCHITECTURE.md: providers, ownership ingest, and discovery
- docs/OWNERSHIP_SYNC.md: snapshot manifest and sync rules
- docs/OWNERSHIP_PUBLISH.md: maintainer snapshot publishing
- docs/SMOKE.md: test layout and the live provider drift check
- ROADMAP.md: planned work
- CHANGELOG.md: what each release changed; unreleased entries in changes/
Development
The canonical local and CI verification command is:
nix flake check -L
It covers Rust formatting, Clippy, unit and CLI integration tests, crate
package verification, the packaged binary, publisher regressions, installer
tests with sh and dash, and ShellCheck. The checks use pinned tools and
cached Nix outputs; an unchanged successful check is reused rather than rerun.
For a focused edit/debug loop, use the same pinned toolchain:
nix develop --command cargo test full_screener
Configured Prek hooks keep whitespace/conflict checks at pre-commit and run
nix flake check -L at pre-push. There is no separate full Cargo test/lint gate
to repeat after a successful flake check.
CI additionally checks the installer with native macOS tools. The live
provider drift check (scripts/live-smoke.sh) is opt-in; see
docs/SMOKE.md. The npm wrapper has its own harness,
scripts/npm-smoke.sh.
License
MIT