my-provider-dash-manager 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +253 -239
  2. package/package.json +2 -1
  3. package/src/main.js +1306 -1259
package/README.md CHANGED
@@ -1,239 +1,253 @@
1
- # My Provider Dash Manager
2
-
3
- **One desktop app for every cloud account you own.** Keep several Vercel, Netlify, Supabase,
4
- Cloudflare, Railway, Render and GitHub accounts signed in at the same time, each in a fully isolated
5
- session, and switch between them instantly — the way a browser handles tabs, but built around
6
- *accounts* instead of pages.
7
-
8
- <sub>Windows desktop app · Electron 43 · local-first · no telemetry, no account, no server ·
9
- source-available licence: free for personal and commercial use</sub>
10
-
11
- ---
12
-
13
- ## Install
14
-
15
- Download the latest installer from
16
- [Releases](https://github.com/FiredMosquito831/my-provider-dash-manager/releases) and run it.
17
-
18
- The installer is not code-signed yet, so SmartScreen shows a warning: choose **More info → Run
19
- anyway**.
20
-
21
- ### Updates
22
-
23
- The Home screen has an **Updates** panel: it shows your installed version, the latest release, the
24
- release notes, and gives you *Check for updates*, *Download*, and *Restart & install* buttons with
25
- download progress. Nothing is downloaded or installed without you pressing the button, and the app
26
- checks quietly on startup and once an hour after that.
27
-
28
- The repository is public, so updates need no setup. (If you ever fork this into a private repo, the
29
- panel lets you store a GitHub token, encrypted with Windows DPAPI, so the feed stays readable.)
30
-
31
- ### Install from the command line
32
-
33
- ```bash
34
- npx my-provider-dash-manager # install (or update) and launch
35
- ```
36
-
37
- The same CLI manages the whole lifecycle — install it globally with
38
- `npm i -g my-provider-dash-manager` and the commands are also available as `mpdm`:
39
-
40
- | Command | What it does |
41
- |---|---|
42
- | `my-provider-dash-manager` | Install or update to the newest release, then launch |
43
- | `… install` / `… update` | Install or update only |
44
- | `… start` | Launch the installed app |
45
- | `… status` | Installed version vs latest, plus where the app and your data live |
46
- | `… where` | Print the install and data paths |
47
- | `… uninstall` | Run the uninstaller (your accounts and sessions are kept) |
48
-
49
- Flags: `--silent` (no wizard), `--download-only`, `--force`, `--version`, `--help`.
50
- From a checkout of this repository the equivalent is `npm run install:latest`.
51
-
52
- It prints the latest version and its release notes and verifies the download really is a Windows
53
- executable before running it. No authentication is needed; a `GH_TOKEN` is used only if present.
54
-
55
- ### Run from source
56
-
57
- ```bash
58
- npm install
59
- npm start
60
- ```
61
-
62
- ---
63
-
64
- ## What it looks like
65
-
66
- **Home — every service and account in one grid, with the account rail on the left.**
67
- Each provider lists its accounts; hovering one reveals open / sleep / close / fill-login / connect-token / manage.
68
-
69
- ![Home screen](docs/screenshots/home.png)
70
-
71
- **A real dashboard, signed in, inside the app.** The rail and tab strip stay put, so Home is always one click away.
72
-
73
- ![A dashboard open in the app](docs/screenshots/dashboard.png)
74
-
75
- **The top bar is only your open tabs** — filter them, or group them by provider with collapsible sections.
76
- Slept tabs stay in the strip (dimmed) and resume on click.
77
-
78
- ![Tabs grouped by provider](docs/screenshots/tabs-grouped.png)
79
-
80
- **Updates and saved logins live on Home**: installed vs latest version with release notes and an update
81
- button, plus login remembering, auto-fill and password import.
82
-
83
- ![Updates and saved logins](docs/screenshots/settings.png)
84
-
85
- <sub>Screenshots use a demo profile with placeholder account names.</sub>
86
-
87
- ---
88
-
89
- ## Why it exists
90
-
91
- Every cloud provider assumes you have exactly one identity. The moment you have a personal account
92
- and a client account on the same service, the browser fights you:
93
-
94
- | The usual pain | What this app does |
95
- |---|---|
96
- | Signing out of one account to reach another | Every account stays signed in, in its own storage partition |
97
- | Juggling browser profiles, one window each | One window: providers on the left, open accounts as tabs on top |
98
- | "Which account am I actually in right now?" | Every tab and rail row is colour-coded and labelled by account |
99
- | Losing your workspace on restart | The open-tab set is remembered and restored |
100
- | Re-typing passwords for the fifth account | Logins are captured per account and refilled automatically |
101
- | Ads and blinding white dashboards | Built-in ad-blocking and dark mode, no extensions required |
102
-
103
- It is not a browser and not a scraper. It is a **container for identities**: real dashboards, real
104
- sessions, one place.
105
-
106
- ---
107
-
108
- ## Features
109
-
110
- ### Accounts and sessions
111
- - **Unlimited accounts per service.** Each account gets its own Chromium storage partition — separate
112
- cookies, localStorage, IndexedDB and cache. Accounts can never see each other's session.
113
- - **Sessions persist across restarts.** Sign in once; you stay signed in (verified by an automated
114
- restart test that counts real cookies after relaunch).
115
- - **Instant switching.** Active tabs stay warm, so switching is a visibility toggle, not a reload.
116
- - **Warm-tab limit with sleeping.** Each live dashboard costs roughly 125 MB, so the app keeps a
117
- configurable number warm (default 5) and sleeps the rest. Slept tabs stay in the strip and resume on
118
- click, and sleeping returns the app to about 350 MB. Measured: 5 tabs ≈ 1.0 GB, 10 ≈ 1.6 GB, all
119
- slept ≈ 0.35 GB (private memory, the figure Task Manager reports).
120
- - **Tab session memory.** The set of open tabs is saved and restored on the next launch: recent ones
121
- come back warm, the rest asleep, and you land on the Home grid.
122
- - **Per-account proxy** (optional) with proper connection flushing.
123
-
124
- ### Layout
125
- - **Left rail — your identities.** Providers listed vertically, accounts nested underneath, each with
126
- hover actions: open, sleep, close, fill login, connect an API token, manage. Collapse any provider.
127
- - **Top bar — open tabs only.** A filter box and a group-by-provider toggle with collapsible groups.
128
- - **Home** is always one click (or `Esc`) away: a grid of every service and account with live status.
129
- - Keyboard: `Ctrl+W` sleep, `Ctrl+Shift+W` sleep all, `Ctrl+Tab` cycle, `Ctrl+1…9` jump.
130
-
131
- ### Saved logins
132
- - **Remembers logins you type** inside an account tab, bound to *that* account, so two accounts on the
133
- same service refill with different credentials.
134
- - **Auto-fills sign-in pages** when it recognises one (toggleable), plus a manual fill action.
135
- - **Imports existing passwords** from installed Chromium browsers (Chrome, Edge, Brave, Vivaldi,
136
- Opera) or from a CSV exported by any browser, including Firefox.
137
- - Everything is encrypted at rest with Windows DPAPI. Passwords never reach the app's own UI process.
138
- - **Origin-bound**: a login is tied to the account *and* the service's own domains. A password typed on
139
- another site reached from that tab (an OAuth hand-off, a look-alike page) is never captured as that
140
- account's login, and a saved password is never filled into a page outside the service's domains.
141
-
142
- ### API status
143
- Paste a read-only API token into an account and its Home card shows live status — project counts and
144
- names for every built-in service, plus latest deploy state on Vercel. Tokens are validated before
145
- being stored, encrypted with DPAPI, revocable in one click, and never leave the main process.
146
-
147
- ### Content
148
- - **Ad-blocking** driven by EasyList (~52,000 blocked hosts plus generic cosmetic rules, refreshed
149
- weekly) applied per account partition. Main-frame navigation is never blocked.
150
- - **Dark mode**: sites that support `prefers-color-scheme` go dark natively, and an optional
151
- force-dark inversion covers the ones that don't.
152
-
153
- ### Extensibility
154
- - **Add any service by URL** — it gets its own rail row and isolated per-account sessions.
155
- - **Service plugins**: drop a small JSON manifest into `plugins/` (or install it from the UI) to
156
- define a service and, optionally, how to read its API for status cards.
157
-
158
- ---
159
-
160
- ---
161
-
162
- ## Using it
163
-
164
- 1. **Add an account** — click `+` next to a provider in the left rail, name it, then choose *Log in*
165
- or *Create a new account*. The service's real page opens inside that account's isolated session.
166
- 2. **Sign in normally.** Use email/password or GitHub. Avoid "Continue with Google": Google blocks
167
- sign-in inside embedded browsers, so use the **Browser** button to finish that flow in your system
168
- browser instead.
169
- 3. **Switch accounts** by clicking a tab or a rail row. Everything stays signed in.
170
- 4. **Connect a token** (optional) via the link icon on any account to light up its status card.
171
- 5. **Import passwords** (optional) from Home → *Import from browser* or *Import CSV*.
172
-
173
- ### Multiple accounts and provider terms
174
-
175
- The app surfaces each provider's stance instead of hiding it. GitHub and Railway allow one account
176
- per person and the rail says so — use their organisations and workspaces instead. Vercel, Netlify,
177
- Supabase and Cloudflare tolerate separate accounts but watch for abuse. Account creation is always
178
- manual and guided; nothing is ever automated, because automated signup violates several providers'
179
- acceptable-use policies.
180
-
181
- ---
182
-
183
- ## How it works
184
-
185
- Each account is a `persist:<service>__<account>` Chromium partition rendered in its own
186
- `WebContentsView`. The app window composes those views beside a native rail and tab strip, so the
187
- chrome is always reachable. Account pages run sandboxed with context isolation, deny-by-default
188
- permissions, and an isolated-world preload that handles login capture and filling without exposing
189
- anything to the page.
190
-
191
- State lives in your user-data folder: `accounts.json` (the registry), `session.json` (open tabs),
192
- `settings.json`, `services.json` (custom services), `plugins/`, plus DPAPI-encrypted `tokens.json`
193
- and `credentials.json`.
194
-
195
- ### Security posture, honestly
196
-
197
- Cookies, tokens and saved passwords are encrypted at rest with Windows DPAPI, which protects against
198
- another user on the machine, a stolen disk, and casual copying. It does **not** protect against
199
- malware running as you — no desktop app can, which is why the app never masks device identity and
200
- keeps API tokens scoped and revocable. Saved logins are additionally bound to the service's own origins,
201
- so they cannot be captured from — or filled into — an unrelated site. Nothing syncs anywhere: there is
202
- no server, no account and no telemetry.
203
-
204
- ---
205
-
206
- ## Development
207
-
208
- ```bash
209
- npm start # run the app
210
- npm run smoke # sessions, registry, partitions
211
- npm run smoke:restore# sessions survive a restart (real cookies)
212
- npm run smoke:tokens # DPAPI round-trip + live token rejection
213
- npm run smoke:creds # import, per-account recall, encryption at rest
214
- npm run smoke:autofill # real page: form detection, fill, capture
215
- npm run smoke:updates # version comparison + real release-feed check
216
- npm run capture # screenshot the running shell
217
- npm run spike # memory benchmark
218
- npm run dist # build the Windows installer
219
- npm run install:latest # fetch and run the latest released installer
220
- npm start -- --print-paths # show the app name, version and data folder
221
- npm start -- --open vercel::personal # open an account on launch
222
- ```
223
-
224
- The suite is 35 checks across five modes.
225
-
226
- `MAM_USER_DATA=<dir>` points any command at an isolated profile.
227
-
228
- Releases are cut by pushing a `v*` tag: GitHub Actions builds the NSIS installer, uploads it with the
229
- update feed, and publishes the release.
230
-
231
- ## Licence
232
-
233
- Source-available, © 2026 FiredMosquito831 — see [LICENSE](LICENSE).
234
-
235
- **Free to use, personally and commercially.** You may not modify or redistribute changed versions, or
236
- present the work as your own. If you mention the app anywhere, credit the author and link this repo:
237
-
238
- > My Provider Dash Manager by FiredMosquito831 —
239
- > https://github.com/FiredMosquito831/my-provider-dash-manager
1
+ # My Provider Dash Manager
2
+
3
+ **One desktop app for every cloud account you own.** Keep several Vercel, Netlify, Cloudflare,
4
+ Railway, Render, Fly.io, Heroku, DigitalOcean, Supabase, Neon, GitHub, GitLab, npm, PyPI, Docker Hub,
5
+ Hugging Face and Stripe accounts signed in at the same time, each in a fully isolated session, and
6
+ switch between them instantly — the way a browser handles tabs, but built around *accounts* instead
7
+ of pages.
8
+
9
+ <sub>Windows desktop app · Electron 43 · local-first · no telemetry, no account, no server ·
10
+ source-available licence: free for personal and commercial use</sub>
11
+
12
+ ---
13
+
14
+ ## Install
15
+
16
+ Download the latest installer from
17
+ [Releases](https://github.com/FiredMosquito831/my-provider-dash-manager/releases) and run it.
18
+
19
+ The installer is not code-signed yet, so SmartScreen shows a warning: choose **More info → Run
20
+ anyway**.
21
+
22
+ ### Updates
23
+
24
+ The Home screen has an **Updates** panel: it shows your installed version, the latest release, the
25
+ release notes, and gives you *Check for updates*, *Download*, and *Restart & install* buttons with
26
+ download progress. Nothing is downloaded or installed without you pressing the button, and the app
27
+ checks quietly on startup and once an hour after that.
28
+
29
+ The repository is public, so updates need no setup. (If you ever fork this into a private repo, the
30
+ panel lets you store a GitHub token, encrypted with Windows DPAPI, so the feed stays readable.)
31
+
32
+ ### Install from the command line
33
+
34
+ ```bash
35
+ npx my-provider-dash-manager # install (or update) and launch
36
+ ```
37
+
38
+ The same CLI manages the whole lifecycle — install it globally with
39
+ `npm i -g my-provider-dash-manager` and the commands are also available as `mpdm`:
40
+
41
+ | Command | What it does |
42
+ |---|---|
43
+ | `my-provider-dash-manager` | Install or update to the newest release, then launch |
44
+ | `… install` / `… update` | Install or update only |
45
+ | `… start` | Launch the installed app |
46
+ | `… status` | Installed version vs latest, plus where the app and your data live |
47
+ | `… where` | Print the install and data paths |
48
+ | `… uninstall` | Run the uninstaller (your accounts and sessions are kept) |
49
+
50
+ Flags: `--silent` (no wizard), `--download-only`, `--force`, `--version`, `--help`.
51
+ From a checkout of this repository the equivalent is `npm run install:latest`.
52
+
53
+ It prints the latest version and its release notes and verifies the download really is a Windows
54
+ executable before running it. No authentication is needed; a `GH_TOKEN` is used only if present.
55
+
56
+ ### Run from source
57
+
58
+ ```bash
59
+ npm install
60
+ npm start
61
+ ```
62
+
63
+ ---
64
+
65
+ ## What it looks like
66
+
67
+ **Home — every service and account in one grid, with the account rail on the left.**
68
+ Each provider lists its accounts; hovering one reveals open / sleep / close / fill-login / connect-token / manage.
69
+
70
+ ![Home screen](docs/screenshots/home.png)
71
+
72
+ **A real dashboard, signed in, inside the app.** The rail and tab strip stay put, so Home is always one click away.
73
+
74
+ ![A dashboard open in the app](docs/screenshots/dashboard.png)
75
+
76
+ **The top bar is only your open tabs** — filter them, or group them by provider with collapsible sections.
77
+ Slept tabs stay in the strip (dimmed) and resume on click.
78
+
79
+ ![Tabs grouped by provider](docs/screenshots/tabs-grouped.png)
80
+
81
+ **Updates and saved logins live on Home**: installed vs latest version with release notes and an update
82
+ button, plus login remembering, auto-fill and password import.
83
+
84
+ ![Updates and saved logins](docs/screenshots/settings.png)
85
+
86
+ <sub>Screenshots use a demo profile with placeholder account names.</sub>
87
+
88
+ ---
89
+
90
+ ## Why it exists
91
+
92
+ Every cloud provider assumes you have exactly one identity. The moment you have a personal account
93
+ and a client account on the same service, the browser fights you:
94
+
95
+ | The usual pain | What this app does |
96
+ |---|---|
97
+ | Signing out of one account to reach another | Every account stays signed in, in its own storage partition |
98
+ | Juggling browser profiles, one window each | One window: providers on the left, open accounts as tabs on top |
99
+ | "Which account am I actually in right now?" | Every tab and rail row is colour-coded and labelled by account |
100
+ | Losing your workspace on restart | The open-tab set is remembered and restored |
101
+ | Re-typing passwords for the fifth account | Logins are captured per account and refilled automatically |
102
+ | Ads and blinding white dashboards | Built-in ad-blocking and dark mode, no extensions required |
103
+
104
+ It is not a browser and not a scraper. It is a **container for identities**: real dashboards, real
105
+ sessions, one place.
106
+
107
+ ---
108
+
109
+ ## Features
110
+
111
+ ### Accounts and sessions
112
+ - **Unlimited accounts per service.** Each account gets its own Chromium storage partition — separate
113
+ cookies, localStorage, IndexedDB and cache. Accounts can never see each other's session.
114
+ - **Sessions persist across restarts.** Sign in once; you stay signed in (verified by an automated
115
+ restart test that counts real cookies after relaunch).
116
+ - **Instant switching.** Active tabs stay warm, so switching is a visibility toggle, not a reload.
117
+ - **Warm-tab limit with sleeping.** Each live dashboard costs roughly 125 MB, so the app keeps a
118
+ configurable number warm (default 5) and sleeps the rest. Slept tabs stay in the strip and resume on
119
+ click, and sleeping returns the app to about 350 MB. Measured: 5 tabs ≈ 1.0 GB, 10 ≈ 1.6 GB, all
120
+ slept ≈ 0.35 GB (private memory, the figure Task Manager reports).
121
+ - **Tab session memory.** The set of open tabs is saved and restored on the next launch: recent ones
122
+ come back warm, the rest asleep, and you land on the Home grid.
123
+ - **Per-account proxy** (optional) with proper connection flushing.
124
+
125
+ ### Layout
126
+ - **Left rail — your identities.** Providers listed vertically, accounts nested underneath, each with
127
+ hover actions: open, sleep, close, fill login, connect an API token, manage. Collapse any provider.
128
+ - **Top bar — open tabs only.** A filter box and a group-by-provider toggle with collapsible groups.
129
+ - **Home** is always one click (or `Esc`) away: a grid of every service and account with live status.
130
+ - Keyboard: `Ctrl+W` sleep, `Ctrl+Shift+W` sleep all, `Ctrl+Tab` cycle, `Ctrl+1…9` jump.
131
+
132
+ ### Saved logins
133
+ - **Remembers logins you type** inside an account tab, bound to *that* account, so two accounts on the
134
+ same service refill with different credentials.
135
+ - **Auto-fills sign-in pages** when it recognises one (toggleable), plus a manual fill action.
136
+ - **Imports existing passwords** from installed Chromium browsers (Chrome, Edge, Brave, Vivaldi,
137
+ Opera) or from a CSV exported by any browser, including Firefox.
138
+ - Everything is encrypted at rest with Windows DPAPI. Passwords never reach the app's own UI process.
139
+ - **Origin-bound**: a login is tied to the account *and* the service's own domains. A password typed on
140
+ another site reached from that tab (an OAuth hand-off, a look-alike page) is never captured as that
141
+ account's login, and a saved password is never filled into a page outside the service's domains.
142
+
143
+ ### Built-in services
144
+ Seventeen services ship ready to use, grouped in the rail: **hosting** (Vercel, Netlify, Cloudflare,
145
+ Railway, Render, Fly.io, Heroku, DigitalOcean), **data** (Supabase, Neon), **code and packages**
146
+ (GitHub, GitLab, npm, PyPI, Docker Hub, Hugging Face) and **payments** (Stripe). Every login page is
147
+ verified to load inside an isolated partition by `npm run smoke:services`. Anything else can be added
148
+ by URL or as a plugin (below).
149
+
150
+ ### API status
151
+ Paste a read-only API token into an account and its Home card shows live status — project, app,
152
+ repository or package counts and names for every built-in service except PyPI (whose tokens are
153
+ upload-only), latest deploy state on Vercel, and account name plus charges/payouts state on Stripe.
154
+ The token field tells you which kind of credential each service expects (Docker Hub needs
155
+ `username:token`). Tokens are validated before being stored, encrypted with DPAPI, revocable in one
156
+ click, and never leave the main process.
157
+
158
+ ### Content
159
+ - **Ad-blocking** driven by EasyList (~52,000 blocked hosts plus generic cosmetic rules, refreshed
160
+ weekly) applied per account partition. Main-frame navigation is never blocked.
161
+ - **Dark mode**: sites that support `prefers-color-scheme` go dark natively, and an optional
162
+ force-dark inversion covers the ones that don't.
163
+
164
+ ### Extensibility
165
+ - **Add any service by URL** — it gets its own rail row and isolated per-account sessions.
166
+ - **Service plugins**: drop a small JSON manifest into `plugins/` (or install it from the UI) to
167
+ define a service and, optionally, how to read its API for status cards.
168
+
169
+ ---
170
+
171
+ ---
172
+
173
+ ## Using it
174
+
175
+ 1. **Add an account** — click `+` next to a provider in the left rail, name it, then choose *Log in*
176
+ or *Create a new account*. The service's real page opens inside that account's isolated session.
177
+ 2. **Sign in normally.** Use email/password or GitHub. Avoid "Continue with Google": Google blocks
178
+ sign-in inside embedded browsers, so use the **Browser** button to finish that flow in your system
179
+ browser instead.
180
+ 3. **Switch accounts** by clicking a tab or a rail row. Everything stays signed in.
181
+ 4. **Connect a token** (optional) via the link icon on any account to light up its status card.
182
+ 5. **Import passwords** (optional) from Home → *Import from browser* or *Import CSV*.
183
+
184
+ ### Multiple accounts and provider terms
185
+
186
+ The app surfaces each provider's stance instead of hiding it. GitHub and Railway allow one account
187
+ per person and the rail says so — use their organisations and workspaces instead. Vercel, Netlify,
188
+ Supabase, Cloudflare, Heroku and DigitalOcean tolerate separate accounts but watch for abuse; the
189
+ registries (npm, PyPI, Docker Hub, Hugging Face), GitLab, Fly.io, Neon and Stripe treat extra accounts
190
+ as ordinary (Stripe expects one per business). Account creation is always
191
+ manual and guided; nothing is ever automated, because automated signup violates several providers'
192
+ acceptable-use policies.
193
+
194
+ ---
195
+
196
+ ## How it works
197
+
198
+ Each account is a `persist:<service>__<account>` Chromium partition rendered in its own
199
+ `WebContentsView`. The app window composes those views beside a native rail and tab strip, so the
200
+ chrome is always reachable. Account pages run sandboxed with context isolation, deny-by-default
201
+ permissions, and an isolated-world preload that handles login capture and filling without exposing
202
+ anything to the page.
203
+
204
+ State lives in your user-data folder: `accounts.json` (the registry), `session.json` (open tabs),
205
+ `settings.json`, `services.json` (custom services), `plugins/`, plus DPAPI-encrypted `tokens.json`
206
+ and `credentials.json`.
207
+
208
+ ### Security posture, honestly
209
+
210
+ Cookies, tokens and saved passwords are encrypted at rest with Windows DPAPI, which protects against
211
+ another user on the machine, a stolen disk, and casual copying. It does **not** protect against
212
+ malware running as you — no desktop app can, which is why the app never masks device identity and
213
+ keeps API tokens scoped and revocable. Saved logins are additionally bound to the service's own origins,
214
+ so they cannot be captured from — or filled into — an unrelated site. Nothing syncs anywhere: there is
215
+ no server, no account and no telemetry.
216
+
217
+ ---
218
+
219
+ ## Development
220
+
221
+ ```bash
222
+ npm start # run the app
223
+ npm run smoke # sessions, registry, partitions
224
+ npm run smoke:restore# sessions survive a restart (real cookies)
225
+ npm run smoke:tokens # DPAPI round-trip + live token rejection
226
+ npm run smoke:creds # import, per-account recall, encryption at rest
227
+ npm run smoke:autofill # real page: form detection, fill, capture
228
+ npm run smoke:updates # version comparison + real release-feed check
229
+ npm run smoke:services # every built-in login page loads inside an isolated partition
230
+ npm run capture # screenshot the running shell
231
+ npm run spike # memory benchmark
232
+ npm run dist # build the Windows installer
233
+ npm run install:latest # fetch and run the latest released installer
234
+ npm start -- --print-paths # show the app name, version and data folder
235
+ npm start -- --open vercel::personal # open an account on launch
236
+ ```
237
+
238
+ The suite is 35 checks across five modes.
239
+
240
+ `MAM_USER_DATA=<dir>` points any command at an isolated profile.
241
+
242
+ Releases are cut by pushing a `v*` tag: GitHub Actions builds the NSIS installer, uploads it with the
243
+ update feed, and publishes the release.
244
+
245
+ ## Licence
246
+
247
+ Source-available, © 2026 FiredMosquito831 — see [LICENSE](LICENSE).
248
+
249
+ **Free to use, personally and commercially.** You may not modify or redistribute changed versions, or
250
+ present the work as your own. If you mention the app anywhere, credit the author and link this repo:
251
+
252
+ > My Provider Dash Manager by FiredMosquito831 —
253
+ > https://github.com/FiredMosquito831/my-provider-dash-manager
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "my-provider-dash-manager",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Manage many accounts per cloud service (Vercel, Netlify, Supabase, Cloudflare, Railway, Render, GitHub) in one desktop app \u2014 isolated persistent sessions, one tab per account.",
5
5
  "main": "src/main.js",
6
6
  "scripts": {
@@ -16,6 +16,7 @@
16
16
  "internal:save": "git --git-dir=.internal-git --work-tree=. add -f CLAUDE.md docs/WORKING-NOTES.md && git --git-dir=.internal-git --work-tree=. commit -m \"internal notes snapshot\"",
17
17
  "internal:log": "git --git-dir=.internal-git --work-tree=. log --oneline",
18
18
  "smoke:updates": "electron . --smoke-updates",
19
+ "smoke:services": "electron . --smoke-services",
19
20
  "install:latest": "node scripts/install-latest.js"
20
21
  },
21
22
  "devDependencies": {