vibe-astock: A-share review dashboard that keeps computed numbers away from AI text
A-share short-term review dashboard covering limit-up pools, consecutive-limit ladders, dragon-tiger lists and sector capital flow in one screen. Derived sentiment metrics (profit effect, promotion rate, ladder gaps, sentiment cycle) are computed locally, not by AI; AI only turns the data into readable commentary. Runs fully locally, works with Claude/Codex subscriptions without an API key.
At a glance
- What is it?
- Vibe AStock is a local web workbench for A-share short-term review, built on FastAPI with a LangGraph orchestration layer. What makes it readable is not the seven modules but the discipline it states everywhere: market data and statistics never come from the model, AI only writes the narrative, and the boundary between sample statistics and tradeable return is drawn explicitly.
- Who is it for?
- Use Vibe AStock if you do A-share short-term review daily and want the arithmetic separated from the commentary, with a deterministic backtest module behind a confirmation step. Do not read its sample statistics as returns, and do not treat its checks as a correctness guarantee, which the project itself says they are not.
- Can I use it commercially?
- Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 2 days ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.
Star history
- simonlin1212/vibe-astock1,034 ★ · +428
| Repository | 2026-09-28 | 2026-11-14 |
|---|---|---|
| simonlin1212/vibe-astock | 606 | 1k |
428 Stars in the last 47 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
Seven modules, and a hard line between computed numbers and generated text
The dashboard has seven top-level modules: a home page with chat and recent reports, intraday watching, the review itself, a news radar, single-stock research, backtesting, and a personal area for holdings and a trade journal. The AI entry point sits at the bottom of the sidebar.
The design constraint is stated up front and repeated everywhere else. Data, program-computed values, human records and AI interpretation are presented separately. Market data and statistics do not depend on the model generating anything. Sentiment tiers are described as an analytical framework rather than an objective fact, and cannot be turned into a trading conclusion from any single indicator.
The constraints on output are equally concrete. The product is required not to emit investment decisions, buy and sell advice or position instructions. The bull and bear debate organises a bullish reading, a risk reading and counter-evidence for one ticker, then lists the disagreements it could not resolve, without forcing a winner and without a participation leaning. Every AI route attaches research constraints, and explicit trading advice is checked for in ordinary chat and in report paths. The README is explicit about the limit of those checks: they reduce out-of-bounds answers and miscitation, and they do not constitute a complete guarantee of semantic correctness.
All three recent releases landed on 2026-09-20
The release history explains itself. v1.1.1, titled as a LAN access fix and a self-hosted model gateway, was published at 09:21 UTC on 2026-09-20. v1.1.2 followed at 10:01, and v1.1.3 at 12:07. The headline of v1.1.3 is a regression fix for v1.1.2: the address the self-hosted gateway printed at startup, `http://0.0.0.0:<port>`, became usable again, and the message shown when the port is wrong now points directly at the port.
So the current version is the third attempt at one afternoon, and the thing being fixed is a diagnostic string rather than a feature. That is worth noting because it is the failure mode you hit first: if the gateway prints an address that cannot be reached, the first thing a user sees is a connection error with no obvious cause.
The last push was on 2026-09-25, five days after those releases, and the repository is not archived. The README also carries a short note from the author looking for work in Shenzhen, Hong Kong or remote, with a contact address.
Install the renamed mini-racer or two panels stay silently empty
The most valuable paragraph in the repository is a comment in `requirements.txt`. The sector capital-flow interface needs a JavaScript engine to deobfuscate the scripts served by the data provider, which means a JS runtime is a hard dependency for that one feature. The package must be `mini-racer`, and it must not be the older `py_mini_racer`, because both install into the same `py_mini_racer/` directory and overwrite each other.
The documented symptom of getting it wrong is precise. The old package's Python code combined with the new package's binary raises `dlsym(mr_eval_context): symbol not found` when called, and the panels for sector capital and capital rotation simply stay blank: the interface returns 200 and an empty `sectors: []` list. Nothing errors visibly. The remedy for anyone who already installed the old package is given as an explicit pair of commands, uninstalling `py_mini_racer` and force-reinstalling `mini-racer`.
The rest of the dependency list is conventional and mostly ranged: `langgraph`, `langchain-core`, `langchain-openai`, `pydantic`, `fastapi`, `uvicorn`, `beautifulsoup4`, `akshare`, `numpy`, `pandas`, `baostock` and `pytest`. Two entries stand out. `mcp` is pinned exactly at 1.26.0 for the controlled review agent tool protocol, and the orchestration engine is noted as borrowed from another project for A-shares.
Data lives in six places and no single variable moves them
The data table is the section to read before backing anything up, because the locations are independent. Agent sessions, tasks, the evidence ledger and the product login live under `~/.vibe-astock-agent/`, changeable with `ASTOCK_AGENT_HOME`. Reviews, versions, the trade journal and raw archives live under `~/.duanxian-agents/` with `reviews/`, `journal/` and `archive/` subdirectories, settable to an absolute path with `ASTOCK_DATA_HOME`. Market data and the intraday cache sit in `~/.vibe-astock-agent/market-data/` with `VR_DATA_DIR`. Research reports default to a `myreports/` folder inside that market directory, with `VR_REPORTS_DIR` to move them. The watchlist, research records, interface state and API configuration live in the browser's local storage for the site you opened, which means changing browser, port or clearing site data breaks reading them. Development logs and diagnostics go to `.local/` in the repository, excluded from version control by default.
The README then says the part that matters for backups: these locations are not migrated by a single switch. Changing `ASTOCK_AGENT_HOME` does not move the trade journal, the market data or the browser data. A backup has to cover the directories actually in use plus whatever the pages can export.
It also warns against committing private records, API keys or login files to the repository, and against copying a development assistant's login files to stand in for product authorisation.
Loopback only until you set VIBE_ALLOW_HOSTS
The service listens on `http://127.0.0.1:8910` and only on the loopback interface. On macOS and Linux the launch is three scripts:
sh scripts/setup
sh scripts/doctor
sh scripts/startWindows 10 and 11 have their own path with a `manage.py` entry point, and both platforms ship a double-clickable launcher with a Chinese filename at the repository root. A different port is passed by adding `--port 8911` after `start`.
Moving the service onto a network or behind a reverse proxy requires listing the Host values you will use in the `VIBE_ALLOW_HOSTS` environment variable, comma separated, which can live in `.env`. Any Host not on that list is refused by every interface with a 403, and the symptom is that the page fails to read data everywhere at once. Three values are always allowed and need no entry: `127.0.0.1`, `::1` and `localhost`. Other loopback addresses are not, so `127.0.0.2` returns 403 until you add it.
The self-hosted gateway route has its own rule: loopback, RFC1918 private ranges, the unspecified address `0.0.0.0` and IPv6 unique-local addresses may use plain HTTP on any port, while a public address still has to use HTTPS on a standard port.
Eight AI routes, each with its stated verification boundary
The access table is unusually honest about what has actually been exercised. The Codex subscription route uses a product-specific ChatGPT authorisation and an isolated engine, with real login, connection and run records, and model availability limited by the account's quota. The Claude subscription route goes through the official local CLI, needs your own install, login and valid subscription, and a past success does not mean the account is usable now. WorkBuddy and CodeBuddy use a local CLI login, and the verification covers only the CodeBuddy CLI 2.137.1 bundled with WorkBuddy on macOS, for connection, controlled tools, ordinary chat and one full single-day review.
The API routes are separated from the subscription ones on purpose. OpenAI API uses your own configuration, and subscription tests are explicitly not accepted as a substitute for API testing, with full compatibility acceptance unfinished. DeepSeek and MiMo provide model and address presets you can edit and test with your own key. A CC Switch local routing or self-hosted gateway preset points at `http://127.0.0.1:15721/v1` with the key usually set to `PROXY_MANAGED`, and the route has to support streaming Responses and tool calling. Zhipu GLM, Kimi and Tongyi Qianwen use Alibaba Cloud Bailian presets needing a workspace address and key. SiliconFlow, MiniMax, OpenRouter, Groq, Together and custom endpoints come with editable address and model fields, and the table states plainly that a preset does not mean compatibility has been verified.
Agent mode is off by default: ordinary chat enables neither tools nor network access.
Snapshot polling is not tick data, and the review will not backfill
The intraday module is built on quote snapshots rather than tick data, and the README says so. The real-time feed aggregates events that have already happened, such as sharp moves and boards opening, and can be filtered by the ranges and thresholds the page offers, but polling cannot guarantee capturing every intraday change.
The intraday verification screen compares observation conditions from a review against that day's valid snapshots. It answers whether an earlier condition appeared, where the real-time feed answers what just happened, and it reads finished records and saved snapshots. What it cannot do is reconstruct a historical intraday moment from current quotes, because that moment was never recorded. Collection depends on the local service running and on the data source being available, and night, lunch break or expired quotes are not treated as valid intraday snapshots.
The same discipline governs review generation. The page separates your selected date, the trading day of the current report and the generation time, so an existing report cannot be passed off as a newly chosen date. Each data fetch shows its category with a 90 second per-fetch ceiling bounded by the remaining run time, a timeout or cancel cleans up the process, and AI generation time is counted separately. A failed run keeps the old draft, regenerating on the same day saves a version, and going back to an earlier date later does not roll back the newest report.
Editorial conclusion
Use Vibe AStock if you do A-share short-term review daily and want the arithmetic separated from the commentary, with a deterministic backtest module behind a confirmation step. Do not read its sample statistics as returns, and do not treat its checks as a correctness guarantee, which the project itself says they are not. Before running it, install the renamed mini-racer package rather than py_mini_racer or two panels will stay silently empty, back up the directories listed in the data table because no single environment variable moves them all, and keep VIBE_ALLOW_HOSTS unset unless you need LAN access.
Frequently asked questions
How do I start Vibe AStock on macOS or Linux?
From the extracted source, run `sh scripts/setup`, then `sh scripts/doctor`, then `sh scripts/start`. You need Python 3.10 or newer with 3.12 recommended, plus Node.js 22 with npm, and the first setup downloads dependencies. The service then listens on `http://127.0.0.1:8910` on the loopback interface only.
How do I reach Vibe AStock from another machine on my network?
Put the Host values you will use into `VIBE_ALLOW_HOSTS`, comma separated, in the environment or in `.env`. Any Host not on the list is refused by every interface with a 403, which shows up as the page failing to read data everywhere. `127.0.0.1`, `::1` and `localhost` are always allowed, while other loopback addresses such as `127.0.0.2` are not.
Does Vibe AStock need an API key?
Not necessarily. There are Codex and Claude subscription routes, and MiMo credentials load by default from a config file outside the project. You complete the AI access page, run a connection test and save the result; viewing quotes and existing records does not require generating an AI report first.
Why are the sector capital panels empty in Vibe AStock?
Usually the wrong JS engine package. `requirements.txt` requires the renamed `mini-racer` and warns against the old `py_mini_racer`, because both install into the same directory and overwrite each other, producing a `dlsym(mr_eval_context): symbol not found` error and blank panels that still return HTTP 200 with an empty sectors list. The fix is to uninstall `py_mini_racer` and force-reinstall `mini-racer`.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/simonlin1212-vibe-astock)Star history chart for your README
[](https://hysenlabs.com/projects/simonlin1212-vibe-astock)Was this useful?