Fincept Terminal is an open-source native C++20/Qt6 financial intelligence platform with 50+ screens, embedded Python analytics, and 100+ data connectors. This guide is the canonical how-to for contributors — build, architecture, conventions.
Before you open a PR, also read the contribution policy:
.github/CONTRIBUTING.md. Policy defines which PRs are accepted (linked approved issue, minimum scope, no auto-formatter churn, etc.); this file covers how to build and where code lives.
- Ways to Contribute
- Tech Stack
- Prerequisites
- Build
- Run
- Project Architecture
- Code Conventions
- Development Workflow
- Language-Specific Guides
- Getting Help
| Area | Examples |
|---|---|
| C++ / Qt | New screens, services, core infrastructure, performance fixes |
| Python | Analytics scripts, AI agents, data fetchers |
| Data sources | Broker integrations, government / market data connectors |
| Documentation | Fix broken/outdated docs (see policy for scope) |
| Testing | Reproduce bugs, review PRs, write tests |
| Layer | Technology |
|---|---|
| Language | C++20 — MSVC 19.38 (VS 2022 17.8) / GCC 12.3 / Apple Clang 15.0 |
| UI | Qt 6.8.3 EXACT Widgets (pinned) |
| Charts | Qt6 Charts |
| Networking | Qt6 Network + Qt6 WebSockets |
| Database | Qt6 Sql (SQLite) |
| Analytics | Embedded Python 3.11.9 (4000+ scripts) |
| Excel I/O | QXlsx v1.4.9 (FetchContent, pinned commit) |
| Mapping | QGeoView (pinned commit) |
| Build | CMake 3.27.7 + Ninja 1.11.1 (pinned, unity build) |
Pinned toolchain versions — enforced by CMake. Mismatch produces a clear fail-fast error.
| Tool | Version |
|---|---|
| C++ compiler | MSVC 19.38 (VS 2022 17.8) / GCC 12.3 / Apple Clang 15.0 (Xcode 15.2) |
| CMake | 3.27.7 — cmake.org |
| Ninja | 1.11.1 — releases |
| Qt | 6.8.3 — Qt Online Installer |
| Python | 3.11.9 — python.org |
| Git | latest — git-scm.com |
Optional (speeds up rebuilds): ccache 4.13.4 on Windows is auto-detected.
git clone https://github.com/Fincept-Corporation/FinceptTerminal.git
cd FinceptTerminal
./setup.sh # Linux / macOS — installs toolchain + Qt via aqtinstall, then builds
setup.bat # Windows — run from a VS 2022 Developer Command PromptAll day-to-day development uses presets from fincept-qt/CMakePresets.json.
cd fincept-qt
# Configure (one-time, or after CMakeLists.txt changes)
cmake --preset win-release # Windows
cmake --preset linux-release # Linux
cmake --preset macos-release # macOS
# Build (run after every code change — incremental)
cmake --build --preset win-release # Windows
cmake --build --preset linux-release # Linux
cmake --build --preset macos-release # macOSDebug builds: replace release with debug in both commands.
Manual configure if presets can't resolve Qt:
cmake -B build/win-release -G Ninja -DCMAKE_BUILD_TYPE=Release `
-DCMAKE_PREFIX_PATH="C:/Qt/6.8.3/msvc2022_64"
cmake --build build/win-release.\build\win-release\FinceptTerminal.exe # Windows
./build/linux-release/FinceptTerminal # Linux
./build/macos-release/FinceptTerminal.app/Contents/MacOS/FinceptTerminal # macOSfinceptTerminal/
├── fincept-qt/ # Main C++ application (all development happens here)
│ ├── src/ # C++ source
│ ├── scripts/ # Embedded Python analytics (4000+ files)
│ ├── resources/ # Icons, assets, Qt resources
│ ├── CMakeLists.txt
│ ├── CMakePresets.json
│ ├── CLAUDE.md # Performance/architecture rules (P1–P15, D1–D5)
│ └── DESIGN_SYSTEM.md # Obsidian UI/UX spec
├── docs/ # Repo-wide documentation (this file lives here)
├── .github/ # Issue/PR templates, workflows, contribution policy
└── README.md
src/
├── app/ # Entry point, MainWindow, routing, splash
├── core/ # Config, events, logging, Result<T>, session
├── ui/ # Theme, reusable widgets, tables, charts, navigation
├── network/ # http/ and websocket/ clients
├── storage/ # SQLite, cache, secure storage, 16 repositories
├── auth/ # Guest + registered auth, JWT
├── python/ # Embedded Python bridge, PythonRunner
├── datahub/ # DataHub producers/consumers (see DATAHUB_ARCHITECTURE.md)
├── services/ # 18 service domains — market data, news, agents, workflow, etc.
├── trading/ # Trading core + 18 broker integrations
├── mcp/ # Model Context Protocol infrastructure (24 tool modules)
├── ai_chat/ # AI chat UI + LlmService
└── screens/ # 50+ terminal screens, one subdirectory each
scripts/
├── Analytics/ # CFA-level quant modules — equity, portfolio, derivatives,
│ # fixed income, economics, corporate finance
├── agents/ # AI agent frameworks (finagent_core, Geopolitics, HedgeFund, …)
├── ai_quant_lab/ # ML, factor discovery, HFT, RL trading, vision quant
├── agno_trading/ # Agno-based trading agents
└── *.py # 100+ top-level data fetchers (market, gov, economic, alt)
See fincept-qt/CLAUDE.md for the detailed service catalog and architecture rules.
- Standard: C++20
- Naming:
snake_casefunctions/variables,PascalCasetypes/classes - Namespaces:
namespace fincept {},namespace fincept::ui {}; neverusing namespace std; - Qt:
Q_OBJECTin all QObject subclasses; pointer-to-member signal/slot syntax only (neverSIGNAL()/SLOT()string macros) - Error handling:
Result<T>— no raw exception-based APIs across module boundaries - Logging:
LOG_INFO/LOG_WARN/LOG_ERROR/LOG_DEBUGwith a context tag, e.g.LOG_INFO("MarketData", "Fetched 12 quotes"). Never log API keys or credentials.
- Style: match surrounding code. Do not run Black / autopep8 / isort on existing files.
- Logging: use the
loggingmodule (logger = logging.getLogger(__name__),logger.info(...)), neverprint(). Scripts run inside an embedded Qt runtime;print()output never reaches the user. - Entry points: C++ invokes scripts through
PythonRunner::instance().run(...)— your script receives a JSON payload on stdin and must return JSON on stdout. See existing scripts inscripts/for the pattern.
Follow fincept-qt/DESIGN_SYSTEM.md (Obsidian design system). Do not introduce ad-hoc color values, typography, or spacing — use the tokens.
Full detail in fincept-qt/CLAUDE.md. These are non-negotiable — PRs that violate them will be sent back:
- P1. Never block the UI thread — no
waitForFinished()on main thread. - P2. Lazy screen construction — use
register_factory()for any screen that fetches data. - P3. Timers must start/stop in
showEvent()/hideEvent(), never in constructors. - P4. Python subprocesses go through
PythonRunner(max 3 concurrent). - P6. Screens render UI only; services do all fetching, caching, processing.
- P14. Logs use the
LOG_*macros (C++) orlogger(Python). Neverprintf/print/std::cout. - D1–D5. Streaming data flows through the DataHub — never spawn Python directly from a screen. See
fincept-qt/DATAHUB_ARCHITECTURE.md.
feat/add-options-screen
fix/chart-render-crash
docs/update-python-guide
perf/market-data-coalesce
refactor/broker-http
Never PR from your fork's main — always a topic branch.
type: short imperative subject line
Optional body explaining why, not what. Wrap at ~72 cols.
Types: feat, fix, docs, refactor, test, chore, perf
- Confirm the issue you're fixing carries one of:
good-first-issue,help-wanted,scope:approved(see.github/CONTRIBUTING.md). - Build locally and run the app — verify the fix / feature works end-to-end.
- Keep the diff minimal. No auto-formatter churn.
- Fill out the PR template honestly; don't tick boxes you didn't verify.
Review process, scope gate, and close-on-sight list are in .github/CONTRIBUTING.md.
| Guide | Coverage |
|---|---|
| C++ Guide | Screens, services, core infrastructure, widgets, Qt patterns |
| Python Guide | Analytics modules, data fetchers, AI agents, PythonRunner contract |
| Architecture | System design, module boundaries, data flow |
| Channel | Link |
|---|---|
| Issues | GitHub Issues |
| Discussions | GitHub Discussions |
| Discord | discord.gg/ae87a8ygbN |
| support@fincept.in |
Good first issues carry the good-first-issue label — those are the right starting point for new contributors.
Repository: https://github.com/Fincept-Corporation/FinceptTerminal License: AGPL-3.0-or-later