mirror of
https://github.com/actualbudget/actual.git
synced 2026-03-09 19:52:56 -05:00
[Feature] Standardized CLI Interface for API Interaction (JSON-RPC over Stdin) #2832
Closed
opened 2026-02-28 20:30:00 -06:00 by GiteaMirror
·
5 comments
No Branch/Tag Specified
master
claude/fix-simplefin-batch-sync-O8LcD
matiss/modal-and-server-refactor
claude/fix-simplefin-ssrf-T31gX
claude/release-notes-validation-X7rvR
ai/custom-theme-dual-prefs
matiss/fix-6804
add-claude-github-actions-1772738270730
react-query-rules
react-query-useSchedules
matiss/separate-lint-format
dependabot/npm_and_yarn/ajv-6.14.0
cursor/sync-performance-notification-9899
react-query-prefs
matiss/chunked-sync-and-progress-ux
v26.2.1
copilot/sub-pr-6880
fix-react-query-clear-on-close-budget
copilot/sub-pr-6140
feat/auto-note
feat/scoped-bank-sync
cursor/desktop-transactions-react-table-1d0c
fix-exhaustive-deps-App
copilot/fix-find-replace-bug
release/v26.2.0-pre
matiss/browser-tests
mobile-fix-drag-and-drop-across-groups
budget-table-v2
PayeeAutocomplete2
pglite
bugfix/plugins/fix-plugins-sw
feat/plugins/plugins-core-package
prerelease
matiss/unicode-minus-fix
cursor/fix-actual-github-issue-6206-gemini-3-pro-preview-9c37
TransactionFormPage
cursor/implement-mortgage-and-loan-account-type-78ca
tests-update-fill-with-pressSequentially
mobile/link-modal
deps/25.11
cursor/fix-update-vrt-apply-ci-job-dispatch-b324
sync-server-plugins
cursor/propose-patch-for-github-issue-5680-2a18
fix/compiler-preserve-inner-dollar-escapes
cursor/analyze-actual-budget-issue-and-propose-fix-5b70
coderabbitai/docstrings/0c070e5
cursor/add-wip-prefix-and-comment-to-prs-d78d
jfdoming/08-21-auto-focus-on-navigate-in-all-browsers
show-totals-on-mobile-budget-banners
allow-child-transactions-make-transfer
mobile-calculator-keyboard
payee-geolocation
enhance/restore_scroll_position
dm-fix-second-click-on-mobile-new-transaction-2
scrollToLocationBudget
alert-autofix-38
tsconfig-composite
mobile-fix-uncategorized-transactions-on-tracking-budgets
server-budget-handlers
fix-sql-injection-in-cleanup-template
non-chrome-draggable-workaround
mobile-budget-page-swipe-navigation
ts-db-all
stable
dark-theme-with-brand-colors
fix-mobile-delete-group
ts-db-select
UnderKoen/reconcile-context-menu
master-before-server-merge
v25.2.1
ts-runQuery
rename-redux-hooks
UnderKoen/3557-persist-state-in-history
remove-redux-CLOSE_BUDGET
fix-exhaustive-deps-errors-FinancesApp
redux-toolkit-createSlice-backup
accounts-function-component
ts-useSplitsExpanded
loot-core-server-package
useTransactios-in-TransactionEdit
react-aria-input
move-redux-to-desktop-client
QueryState-type
fix-themes-applied-late
mobile-vrts
revert-3295-spendingCardFix
react-aria-button-4
split-payee-on-mobile
twk3/pin-apis-crdt
notes-tag-autocomplete
ts-LoadBackup
dnd-kit
package-upgrades
v26.3.0
v26.2.1
v26.2.0
v26.1.0
v25.12.0
v25.11.0
v25.10.0
v25.9.0
v25.8.0
v25.7.1
v25.7.0
v25.6.1
v25.6.0
v25.5.0
v25.4.0
v25.3.1
v25.3.0
v25.2.1
v25.2.0
v25.1.0
v24.12.0
v24.11.0
v24.10.1
v24.10.0
v24.9.0
v24.8.0
v24.7.0
v24.6.0
v24.5.0
v24.4.0
v24.3.0
v24.2.0
v24.1.0
v23.12.0
v23.11.0
v23.10.0
v23.9.0
v23.8.1
v23.8.0
v23.7.2
v23.7.1
v23.7.0
v23.6.0
v23.5.0
v23.4.2
v23.4.1
v23.4.0
v23.3.2
v23.3.0
v23.2.9
v23.2.5
v23.1.12
v22.12.9
Labels
Clear labels
AI generated
API
bank sync
budgeting
bug
can’t replicate
dependencies
docker
documentation
electron
experimental feature
feature
feedback
goal templates
good first issue
help wanted
importers
maintenance
needs info
needs testing
needs triage
needs votes
openid
payees
pull-request
regression
reports
responsive
rules
schedules
server
✨ merged
split transactions
tech debt
theme
transaction import
transaction reconciliation
transactions
translations
upstream
user interface
✅ approved
wontfix
Mirrored from GitHub Pull Request
Milestone
No items
No Milestone
Projects
Clear projects
No project
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: github-starred/actual#2832
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @Zeor-Xain on GitHub (Jan 17, 2026).
Verified feature request does not already exist?
💻
Pitch: what problem are you trying to solve?
The current
@actual-app/apiis excellent but strictly tied to the Node.js ecosystem. As the documentation explicitly states: "Actual does not expose HTTP endpoints that can be called."This architectural choice creates a significant barrier for users and developers who work with other languages (Bash scripts, Python, Go, Rust) or environments where a persistent Node.js process or a custom HTTP wrapper server is overkill or technically infeasible.
To interact with Actual programmatically today, a non-Node developer must:
This fragmentation discourages the creation of community tools (like importers, reporters, or automation bots) in languages other than JavaScript. I recently implemented a custom bridge to import transactions from Python via
docker/podman exec, and while effective, it felt like reinventing a wheel that could be a standard part of the toolkit.Describe your ideal solution to this problem
I suggest adding a Standardized CLI mode to the
@actual-app/apipackage (or a companion package) that implements a simple "JSON-RPC over Stdin" interface.The Mechanism
Instead of writing custom JS scripts for every task, the user would invoke a standard entry point (e.g.,
actual-cli run-bridge) that:Example Workflow
A Python script (or any language) could simply spawn the process and pipe data:
Input (STDIN):
Output (STDOUT):
Why "JSON over Stdin"?
docker exec -i actual-node actual-cli < payload.json).Teaching and learning
Discoverability
This feature positions Actual Budget as "Language Agnostic" for automation. Documentation could feature a "Universal API Usage" section showing examples in Bash, Python and Go, all calling the same underlying
actual-clicommand.Documentation Needs
STDOUTfor data andSTDERRfor logs (to avoid parsing errors if debug logs pollute the output).Potential Pitfalls
Prototype use case
ActualAPI, running side-by-side with theactual_actual_server_1container, configured to use the server container's network and with the data directory mounted at/data.ActualAPIcontainer (npm install --location=global @actual-app/api), serving with a custombridge.jsfor@actual-app/apiactions./bridge.js (expand)
Can run with success passing a json payload to
stdinin terminal:@github-actions[bot] commented on GitHub (Jan 17, 2026):
✨ Thanks for sharing your idea! ✨
This repository uses a voting-based system for feature requests. While enhancement issues are automatically closed, we still welcome feature requests! The voting system helps us gauge community interest in potential features. We also encourage community contributions for any feature requests marked as needing votes (just post a comment first so we can help guide you toward a successful contribution).
The enhancement backlog can be found here: https://github.com/actualbudget/actual/issues?q=label%3A%22needs+votes%22+sort%3Areactions-%2B1-desc+
Don't forget to upvote the top comment with 👍!
@MatissJanis commented on GitHub (Jan 17, 2026):
👋 Feel free to implement this and we'll be happy to link to it in the community projects page: https://actualbudget.org/docs/community-repos
@Zeor-Xain commented on GitHub (Jan 17, 2026):
TL;DR - Feature Request: Actual CLI (JSON-RPC)
The Problem:
The current Actual Budget API is an NPM package exclusive to Node.js. This forces developers using other languages (Python, Go, Rust, Bash) to
either write custom wrappers or learn JavaScript just to move data.
The Solution:
Implement an official Command Line Interface (CLI) that operates via STDIN/STDOUT using JSON.
How it would work:
Key Benefits:
@Zeor-Xain commented on GitHub (Jan 17, 2026):
I understand that the current model, focused on Node.js via
@actual-app/api, is excellent for the primary use case:Custom importers and exporters.
However, the accessibility of the API would improve significantly by adding direct Shell communication.
A "JSON-RPC over Stdin" approach seems to align well with this requirement, being both agnostic and straightforward. This covers the most elementary use case: a Shell pipeline designed to receive a return value.
The inability of the
@actual-app/apito interact with the Shell in a pipeline seems to be a fundamental gap in its current architecture.The choice of "JSON-RPC over Stdin" fits the current API structure well:
In fact, the current "Code-level API" is quite restrictive, and a significant gap. Communicating with the shell would expand the API to also be IPC-based. Therefore, this feature seems appropriate to reside within the official API package, unlike community projects that merely build upon it.
Residing in the official package also brings benefits in security and maintenance, but above all, in communication standardization.
I believe the implementation of this feature addresses these challenges with an effort that is consistent with the benefits.
Question for the maintainers:
I am happy to provide a functional prototype, even though I am unable to join the maintainers at this time:
This is successfully executed in the shell by passing a JSON payload to standard input (stdin):
@MatissJanis commented on GitHub (Jan 17, 2026):
No.
But feel free to build this as a separate project in your github account. And then you can share it with the community via the community projects page I linked above.