[GH-ISSUE #4745] [Bug]: @actual-app/web NPM package was deprecated -- needed for multiple currency budgets #51135

Closed
opened 2026-04-30 17:02:09 -05:00 by GiteaMirror · 5 comments
Owner

Originally created by @tramir on GitHub (Apr 5, 2025).
Original GitHub issue: https://github.com/actualbudget/actual/issues/4745

Verified issue does not already exist?

  • I have searched and found no existing issue

What happened?

I am using dual-actual, which uses a couple of javascripts on top of @actual-app/api to convert from multiple currency accounts to one currency. I am currently unable to update to the last version because the @actual-app/web NPM package was deprecated. The Dockerfile of dual-actual is:

FROM docker.io/actualbudget/actual-server:latest
RUN npm install --save \
    @actual-app/api \
    moment

Thank you for reconsidering this decision.

How can we reproduce the issue?

docker exec -it actual_budget npm install --save @actual-app/api moment

Where are you hosting Actual?

None

What browsers are you seeing the problem on?

No response

Operating System

None

Originally created by @tramir on GitHub (Apr 5, 2025). Original GitHub issue: https://github.com/actualbudget/actual/issues/4745 ### Verified issue does not already exist? - [x] I have searched and found no existing issue ### What happened? I am using [dual-actual](https://github.com/rbjansen/dual-actual), which uses a couple of javascripts on top of @actual-app/api to convert from multiple currency accounts to one currency. I am currently unable to update to the last version because the @actual-app/web NPM package was deprecated. The Dockerfile of dual-actual is: ``` FROM docker.io/actualbudget/actual-server:latest RUN npm install --save \ @actual-app/api \ moment ``` Thank you for reconsidering this decision. ### How can we reproduce the issue? docker exec -it actual_budget npm install --save @actual-app/api moment ### Where are you hosting Actual? None ### What browsers are you seeing the problem on? _No response_ ### Operating System None
GiteaMirror added the needs infobug labels 2026-04-30 17:02:10 -05:00
Author
Owner

@youngcw commented on GitHub (Apr 6, 2025):

I recommend that you reach out to dual-actual to update the dockerfile to build from source instead of pulling down the client.

<!-- gh-comment-id:2781450356 --> @youngcw commented on GitHub (Apr 6, 2025): I recommend that you reach out to dual-actual to update the dockerfile to build from source instead of pulling down the client.
Author
Owner

@MatissJanis commented on GitHub (Apr 6, 2025):

👋 How are you using the web package there? All I can see in dual-actual is that it is using the api package (which we still ship).

<!-- gh-comment-id:2781529026 --> @MatissJanis commented on GitHub (Apr 6, 2025): 👋 How are you using the `web` package there? All I can see in `dual-actual` is that it is using the `api` package (which we still ship).
Author
Owner

@tramir commented on GitHub (Apr 6, 2025):

Thanks @MatissJanis for looking into this. I have no experience working with node (or npm or yarn), but a quick look into this makes me believe that the issue is about dependencies. When I tried to add the api package, node gave the following error:

 > [actual_server 2/2] RUN npm install --save     @actual-app/api     moment:
7.945 npm error code EUNSUPPORTEDPROTOCOL
7.945 npm error Unsupported URL Type "workspace:": workspace:*

So then I looked into which package has a "workspace" dependency. It turns out that the api package has the crdt package listed as a workspace dependency. When I used yarn to install the api package, it pulled the web package as well (I had to choose version 25.3.1 as 25.4.0 doesn't exist). My guess is that this is because the workspace of the crdt package includes the web package. yarn why list this as the reason why the web package is pulled:

root@46b6ef71fcf7:/app# yarn why @actual-app/web
yarn why v1.22.22
[1/4] Why do we have the module "@actual-app/web"...?
[2/4] Initialising dependency graph...
[3/4] Finding dependency...
[4/4] Calculating file sizes...
=> Found "@actual-app/web@25.3.1"
info Has been hoisted to "@actual-app/web"
info This module exists because it's specified in "dependencies".
info Disk size without dependencies: "24.8MB"
info Disk size with unique dependencies: "24.8MB"
info Disk size with transitive dependencies: "24.8MB"
info Number of shared dependencies: 0
Done in 0.69s.

So then the question is: can the crdt package be just a regular package dependency instead of a workspace dependency? If not, then it becomes again -- can you reconsider discontinuing the web package? Please take all my thoughts above with a grain of salt because, again, I have zero experience with node, npm and yarn. And thank you again for looking into this and for such an amazing app!

<!-- gh-comment-id:2781588336 --> @tramir commented on GitHub (Apr 6, 2025): Thanks @MatissJanis for looking into this. I have no experience working with node (or npm or yarn), but a quick look into this makes me believe that the issue is about dependencies. When I tried to add the api package, node gave the following error: ``` > [actual_server 2/2] RUN npm install --save @actual-app/api moment: 7.945 npm error code EUNSUPPORTEDPROTOCOL 7.945 npm error Unsupported URL Type "workspace:": workspace:* ``` So then I looked into which package has a "workspace" dependency. It turns out that the api package has the crdt package listed as a workspace dependency. When I used yarn to install the api package, it pulled the web package as well (I had to choose version 25.3.1 as 25.4.0 doesn't exist). My guess is that this is because the workspace of the crdt package includes the web package. `yarn why` list this as the reason why the web package is pulled: ``` root@46b6ef71fcf7:/app# yarn why @actual-app/web yarn why v1.22.22 [1/4] Why do we have the module "@actual-app/web"...? [2/4] Initialising dependency graph... [3/4] Finding dependency... [4/4] Calculating file sizes... => Found "@actual-app/web@25.3.1" info Has been hoisted to "@actual-app/web" info This module exists because it's specified in "dependencies". info Disk size without dependencies: "24.8MB" info Disk size with unique dependencies: "24.8MB" info Disk size with transitive dependencies: "24.8MB" info Number of shared dependencies: 0 Done in 0.69s. ``` So then the question is: can the crdt package be just a regular package dependency instead of a workspace dependency? If not, then it becomes again -- can you reconsider discontinuing the web package? Please take all my thoughts above with a grain of salt because, again, I have zero experience with node, npm and yarn. And thank you again for looking into this and for such an amazing app!
Author
Owner

@MatissJanis commented on GitHub (Apr 10, 2025):

Would you mind sharing your code somewhere? It feels to me like you're not pulling the API package from npm registry, but instead are pulling directly from Github (in which case - yes - it will not work; but please don't pull directly from the source).

The published @actual-app/api package does not use workspace:^ dependencies. See here: https://www.npmjs.com/package/@actual-app/api?activeTab=code (open the package.json file)

<!-- gh-comment-id:2795072536 --> @MatissJanis commented on GitHub (Apr 10, 2025): Would you mind sharing your code somewhere? It feels to me like you're not pulling the API package from npm registry, but instead are pulling directly from Github (in which case - yes - it will not work; but please don't pull directly from the source). The published `@actual-app/api` package does not use `workspace:^` dependencies. See here: https://www.npmjs.com/package/@actual-app/api?activeTab=code (open the package.json file)
Author
Owner

@tramir commented on GitHub (Apr 15, 2025):

Thanks again @MatissJanis for following up, and my apologies for getting back to you so slowly. It turns out that the issue was as follows: the entry point in the docker container is /app, where there is the package.json from "@actual-app/sync-server, which includes "@actual-app/web": "workspace:*" in its dependencies. The solution was:

  1. replace this line with "@actual-app/web": "25.4.0"
  2. run npm install @actual-app/api
  3. restore the dependcy in package.json to the original "@actual-app/web": "workspace:*"

Using this procedure, the API package installed without a hitch and everything worked as it should have. I don't know if there's anything on your side that can be done to avoid this, but now that there is a solution I'll just pass it on to the author of dual-actual. Thank you again for this wonderful piece of software and for the help figuring this issue out.

<!-- gh-comment-id:2807100293 --> @tramir commented on GitHub (Apr 15, 2025): Thanks again @MatissJanis for following up, and my apologies for getting back to you so slowly. It turns out that the issue was as follows: the entry point in the docker container is `/app`, where there is the `package.json` from `"@actual-app/sync-server`, which includes `"@actual-app/web": "workspace:*"` in its dependencies. The solution was: 1. replace this line with `"@actual-app/web": "25.4.0"` 2. run `npm install @actual-app/api` 3. restore the dependcy in `package.json` to the original `"@actual-app/web": "workspace:*"` Using this procedure, the API package installed without a hitch and everything worked as it should have. I don't know if there's anything on your side that can be done to avoid this, but now that there is a solution I'll just pass it on to the author of `dual-actual`. Thank you again for this wonderful piece of software and for the help figuring this issue out.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/actual#51135