claude-access-for-all 0.0.0-stage → 0.1.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Mark Zhang
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,88 @@
1
- # Temporary Holding Version
1
+ # Claude Access for All
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ **Frontier intelligence should serve humanity, in every corner of the world.**
4
+
5
+ An open, English-language field guide and local toolkit for accessing Claude Code on macOS: subscription choices, network reliability, billing hygiene, account security, and recovery.
6
+
7
+ ## Why this exists
8
+
9
+ The next great scientific idea may come from a student with an aging laptop. The next useful piece of software may begin in a small town, far from a technology hub. Talent is everywhere. Access to the tools that multiply it is still uneven.
10
+
11
+ We believe AI should benefit all of humanity. The ability to learn, build, and participate in the future should reach people across borders, languages, and economic circumstances. That includes developers in corners of the world where access is currently restricted, communities overlooked by product rollouts, and people for whom a failed subscription is a meaningful financial loss.
12
+
13
+ Claude Code is the starting point for this project because we want more people to experience frontier AI in their daily work. Our ambition is a world where the best available models are within everyone's reach. We treat that as a mission, not a permanent benchmark ranking for any single model or company.
14
+
15
+ Open knowledge can reduce confusion, expose misleading promises, help people protect their money and accounts, and make barriers visible to the people who can remove them. We hope this repository becomes a small piece of that shared infrastructure.
16
+
17
+ ## Start here
18
+
19
+ 1. Read [availability and access paths](docs/availability.md) before spending money.
20
+ 2. Follow the [macOS quickstart](docs/macos-quickstart.md).
21
+ 3. Choose and manage a plan with the [subscription playbook](docs/subscriptions.md).
22
+ 4. Diagnose connectivity with the [network and “clean IP” guide](docs/network.md).
23
+ 5. Protect your account with the [account continuity guide](docs/account-continuity.md).
24
+ 6. Review the [client privacy inspector](docs/privacy-inspector.md) for CLI, Desktop, and web.
25
+ 7. Use the [troubleshooting decision table](docs/troubleshooting.md) when something breaks.
26
+
27
+ ## What you get
28
+
29
+ | Area | Practical outcome |
30
+ | --- | --- |
31
+ | macOS setup | Install, authenticate, and verify your billing route |
32
+ | Network reliability | Separate proxy, TLS, service, and account problems |
33
+ | Subscription management | Record billing ownership and review renewals |
34
+ | Account continuity | Secure access, preserve work, and prepare an appeal |
35
+ | Local tools | Offline diagnostics, scoped launchers, browser signal inspector, and calendar reminder |
36
+ | Evidence | Dated official sources and a contribution standard |
37
+
38
+ ## Install and run
39
+
40
+ Requires macOS, Node.js 18+, Python 3.9+, and Git for the GitHub install. Install Claude Code or Claude Desktop separately when needed. Install the CLI from the npm registry or directly from GitHub.
41
+
42
+ Run the interactive menu without a permanent install:
43
+
44
+ ```sh
45
+ npx --yes claude-access-for-all
46
+ ```
47
+
48
+ Or install the command globally:
49
+
50
+ ```sh
51
+ npm install -g claude-access-for-all
52
+ claude-access
53
+ ```
54
+
55
+ Choose an action from the interactive menu, or call one directly:
56
+
57
+ ```sh
58
+ claude-access doctor
59
+ claude-access audit
60
+ claude-access cli --timezone UTC
61
+ claude-access app --timezone UTC
62
+ claude-access web --browser chrome --timezone UTC
63
+ claude-access inspect
64
+ claude-access reminder --renewal 2026-12-01 --days-before 3 > renewal.ics
65
+ open renewal.ics
66
+ ```
67
+
68
+ To install directly from GitHub, use `npm install -g github:AMark-CS/claude-access-for-all`. Use `claude-access help` to see the complete command list. `inspect` opens the local graphical browser inspector in your default browser. To check a separate browser profile, open its local file in that profile instead; see the [privacy inspector guide](docs/privacy-inspector.md).
69
+
70
+ For the calendar reminder, replace the example date with the next billing date shown by your billing provider. The file contains one all-day review event with an alert; import it into Apple Calendar and check your notification settings. It neither cancels nor renews anything, and must be regenerated when the billing date changes.
71
+
72
+ The diagnostics run offline and do not print environment-variable values. The scoped launchers request process-local timezone and language settings; Desktop and browsers may behave differently. The browser launcher opens Claude in a separate profile and prints its private data directory. Review the [privacy guide](docs/privacy-inspector.md) for limitations before use.
73
+
74
+ To run the source version directly without npm, use `python3 tools/access.py doctor` or `python3 tools/privacy.py audit` from a clone. Review the short [source](tools/access.py) before running it.
75
+
76
+ ## Honest boundaries
77
+
78
+ Anthropic currently limits availability by location. A working connection or successful payment does not establish eligibility. This project cannot grant access, reverse a suspension, or guarantee that an account stays active. See the [official availability list](https://support.claude.com/en/articles/8461763-where-can-i-access-claude).
79
+
80
+ We document practical access issues and advocate broader availability. We do not sell accounts, proxy subscriptions, credentials, or guarantees of immunity from account review. No VPN vendor, IP reputation score, or “account warming” ritual is endorsed as a solution to eligibility restrictions.
81
+
82
+ ## Help build this
83
+
84
+ Contribute a reproducible fix, a clearer explanation, an accessibility improvement, or a dated policy correction. Please read [CONTRIBUTING.md](CONTRIBUTING.md), the [evidence register](docs/sources.md), and [SECURITY.md](SECURITY.md) first. Never put account identifiers, IP addresses, receipts, tokens, or payment details in public issues.
85
+
86
+ Potential next steps: a macOS menu bar companion, additional billing-provider walkthroughs, and a structured history of access barriers. These are roadmap ideas.
87
+
88
+ Independent community project. Not affiliated with or endorsed by Anthropic. Claude and Claude Code are their respective owners' trademarks. MIT licensed. Official sources last reviewed **October 27, 2026**; recheck them before purchasing.
package/SECURITY.md ADDED
@@ -0,0 +1,9 @@
1
+ # Security and privacy
2
+
3
+ The offline diagnostics read the local platform, timezone names, and the presence of an allowlist of environment variables. It does not inspect browser cookies, Keychain entries, shell history, Claude settings, or token files. The optional launchers start locally installed apps with requested process-scoped locale and timezone settings. The web launcher opens Claude and creates or reuses a dedicated profile. The local browser inspector collects browser-visible signals only within the page. The tools do not authenticate on your behalf, install software, alter system network settings, or initiate purchases.
4
+
5
+ Calendar output is written to standard output. Shell redirection creates the destination file; the program does not import it into Calendar or change a subscription. No telemetry is collected.
6
+
7
+ Do not post secrets or personal account evidence in public issues. For a code vulnerability, use the repository's private vulnerability reporting feature if enabled. If it is unavailable, open a minimal issue asking for a private reporting channel without disclosing exploit details or sensitive data. For a Claude account problem, contact Anthropic support directly.
8
+
9
+ If a credential is exposed, revoke it with its issuer, review account activity, and remove it from public history as appropriate. Deleting the latest copy of a file does not remove earlier Git commits.
@@ -0,0 +1,101 @@
1
+ #!/usr/bin/env node
2
+ import { spawnSync } from 'node:child_process';
3
+ import { createInterface } from 'node:readline/promises';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { dirname, join } from 'node:path';
6
+
7
+ const root = dirname(dirname(fileURLToPath(import.meta.url)));
8
+ const help = `Claude Access for All
9
+
10
+ Usage: claude-access [command] [options]
11
+
12
+ menu Open the interactive menu (default)
13
+ doctor Check local installation and configuration presence
14
+ audit Inspect CLI environment signals locally
15
+ cli [options] [-- ...] Launch Claude Code with scoped locale settings
16
+ app [options] Launch Claude Desktop with scoped locale settings
17
+ web [options] Launch Claude in a separate browser profile
18
+ inspect Open the local browser signal inspector
19
+ reminder [options] Write a one-time calendar event to stdout
20
+ guide Open the English privacy and access guide
21
+ help Show this help
22
+ version Show the package version
23
+
24
+ Examples:
25
+ claude-access cli --timezone UTC -- --version
26
+ claude-access web --browser edge --timezone UTC
27
+ claude-access reminder --renewal 2026-12-01 --days-before 3 > renewal.ics
28
+
29
+ Requires macOS, Node.js 18+, and Python 3.9+. Launching Claude requires the
30
+ relevant installed app and a valid account. Local signal checks are not a ban
31
+ prediction or an eligibility test. For options run a command with --help.`;
32
+
33
+ function run(command, args) {
34
+ const result = spawnSync(command, args, { stdio: 'inherit' });
35
+ if (result.error) {
36
+ const hint = result.error.code === 'ENOENT' && command === 'python3'
37
+ ? 'Python 3.9+ is required. Install Python from https://www.python.org/downloads/macos/.'
38
+ : `Could not start ${command}: ${result.error.message}`;
39
+ console.error(hint);
40
+ return 1;
41
+ }
42
+ return result.status ?? 1;
43
+ }
44
+
45
+ function dispatch(command, args = []) {
46
+ switch (command) {
47
+ case 'doctor': return run('python3', [join(root, 'tools/access.py'), 'doctor', ...args]);
48
+ case 'audit': return run('python3', [join(root, 'tools/privacy.py'), 'audit', ...args]);
49
+ case 'cli': case 'app': case 'web':
50
+ return run('python3', [join(root, 'tools/privacy.py'), command, ...args]);
51
+ case 'reminder': return run('python3', [join(root, 'tools/access.py'), 'reminder', ...args]);
52
+ case 'inspect':
53
+ if (process.platform !== 'darwin') { console.error('The inspector launcher requires macOS.'); return 1; }
54
+ return run('/usr/bin/open', [join(root, 'web/fingerprint.html')]);
55
+ case 'guide':
56
+ if (process.platform !== 'darwin') { console.error('The guide launcher requires macOS.'); return 1; }
57
+ return run('/usr/bin/open', ['https://github.com/AMark-CS/claude-access-for-all/blob/main/docs/privacy-inspector.md']);
58
+ case 'help': case '--help': case '-h': console.log(help); return 0;
59
+ case 'version': case '--version': case '-v': console.log('0.1.0'); return 0;
60
+ default: console.error(`Unknown command: ${command}\n\n${help}`); return 2;
61
+ }
62
+ }
63
+
64
+ async function menu() {
65
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
66
+ console.error('The interactive menu needs a terminal. Use claude-access help for commands.');
67
+ return 1;
68
+ }
69
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
70
+ try {
71
+ console.log(`\nClaude Access for All\n\n 1 Check local environment\n 2 Inspect CLI signals\n 3 Start Claude Code\n 4 Start Claude Desktop\n 5 Start Claude in a separate browser profile\n 6 Open browser signal inspector\n 7 Open the privacy guide\n 8 Create a renewal calendar file\n 0 Exit\n`);
72
+ const choice = (await rl.question('Choose an option: ')).trim();
73
+ if (choice === '0') return 0;
74
+ const simple = { '1': 'doctor', '2': 'audit', '3': 'cli', '4': 'app', '6': 'inspect', '7': 'guide' };
75
+ if (simple[choice]) { rl.close(); return dispatch(simple[choice]); }
76
+ if (choice === '5') {
77
+ const browser = (await rl.question('Browser (chrome/edge) [chrome]: ')).trim() || 'chrome';
78
+ if (!['chrome', 'edge'].includes(browser)) { console.error('Choose chrome or edge.'); return 2; }
79
+ rl.close(); return dispatch('web', ['--browser', browser]);
80
+ }
81
+ if (choice === '8') {
82
+ const renewal = (await rl.question('Next renewal date (YYYY-MM-DD): ')).trim();
83
+ const output = (await rl.question('Output file path [renewal.ics]: ')).trim() || 'renewal.ics';
84
+ const lead = (await rl.question('Days before renewal [3]: ')).trim() || '3';
85
+ rl.close();
86
+ const result = spawnSync('python3', [join(root, 'tools/access.py'), 'reminder', '--renewal', renewal, '--days-before', lead], { encoding: 'utf8' });
87
+ if (result.error) { console.error('Could not start Python 3.9+.'); return 1; }
88
+ if (result.status !== 0) { console.error(result.stderr.trim()); return result.status ?? 1; }
89
+ const { writeFileSync } = await import('node:fs');
90
+ try { writeFileSync(output, result.stdout, { flag: 'wx', mode: 0o600 }); }
91
+ catch (error) { console.error(`Could not create calendar file: ${error.message}`); return 1; }
92
+ console.log(`Created ${output}. Import it into Calendar and check notification settings.`);
93
+ return 0;
94
+ }
95
+ console.error('Unknown option. Run the menu again to choose 0–8.');
96
+ return 2;
97
+ } finally { rl.close(); }
98
+ }
99
+
100
+ const [command = 'menu', ...args] = process.argv.slice(2);
101
+ process.exitCode = command === 'menu' ? await menu() : dispatch(command, args);
@@ -0,0 +1,36 @@
1
+ # Account continuity and recovery
2
+
3
+ Last reviewed: October 27, 2026.
4
+
5
+ ## Build habits that protect your work
6
+
7
+ Use an email account you control and secure its recovery methods. Use available authentication protections. Keep your device updated, restrict untrusted browser extensions, and avoid sharing signed-in sessions. Never provide a reseller with a password, one-time code, OAuth token, session cookie, or remote access to your Mac.
8
+
9
+ Record billing ownership privately and export important work when appropriate. Keep source code in version control and project knowledge in portable files. Avoid making your only copy of an important deliverable dependent on a service login.
10
+
11
+ Treat changes in travel, billing, organization membership, and network setup as occasions to recheck the current requirements. There is no documented “warm-up” chat schedule, minimum account age, or daily activity pattern that this project can verify as protection against suspension. Anecdotes should remain labeled as anecdotes.
12
+
13
+ ## If access changes
14
+
15
+ First distinguish a service incident, failed renewal, wrong login, usage limit, and account restriction. Each requires a different remedy. The troubleshooting table gives a starting point. Do not assume that every error is a ban or that every ban is an IP issue.
16
+
17
+ For a restriction, preserve the message and date privately and follow [Anthropic's safeguards and appeals process](https://support.claude.com/en/articles/8241253-safeguards-warnings-and-appeals). The official page lists several possible reasons, including unsupported-location account creation and policy violations. The account's own notice and support response are the relevant evidence; outside observers cannot reliably diagnose its enforcement reason.
18
+
19
+ ## Prepare a factual appeal
20
+
21
+ Submit through the official logged-in appeal flow. Use a short factual description:
22
+
23
+ ```text
24
+ I am requesting a review of my account restriction.
25
+ Observed message: [exact text, excluding secrets]
26
+ First observed: [date and timezone]
27
+ Relevant context: [accurate account and access facts]
28
+ Troubleshooting already attempted: [brief list]
29
+ Please clarify the reason and whether any corrective action is available.
30
+ ```
31
+
32
+ Provide identifying or verification material only through a verified private support channel when requested. This template does not promise reinstatement. The official appeals page also describes available data-export and deletion options for restricted accounts.
33
+
34
+ ## Protect your billing separately
35
+
36
+ If access is lost, verify whether renewal remains active through the actual purchase platform. Contact [official support](https://privacy.claude.com/en/articles/9015913-how-to-get-support) if you cannot reach billing settings. Recovery and billing are separate questions; do not assume either reinstatement or an automatic refund.
@@ -0,0 +1,19 @@
1
+ # Availability and access paths
2
+
3
+ Last reviewed: October 27, 2026.
4
+
5
+ Start with the [official supported locations](https://support.claude.com/en/articles/8461763-where-can-i-access-claude). Check the live list for your actual situation rather than relying on a copied country table or an IP lookup. For travel, relocation, or an apparent classification error, ask support how the current rules apply before purchasing.
6
+
7
+ | Situation | Next step |
8
+ | --- | --- |
9
+ | You are eligible and need individual coding access | Review Pro/Max and the macOS quickstart |
10
+ | Your employer provides access | Ask the workspace administrator about your seat and billing |
11
+ | You need programmatic API use | Review Console or an officially supported cloud provider's own terms, regions, and charges |
12
+ | You are outside supported availability | Seek clarification from support; monitor official expansion announcements |
13
+ | Your eligible account appears misclassified | Collect a private, minimal problem description and request review |
14
+
15
+ The [official setup documentation](https://code.claude.com/docs/en/setup) describes subscription, Console, and supported cloud-provider authentication. These routes have different billing and eligibility requirements. A cloud provider is not a guaranteed alternative in an unsupported region.
16
+
17
+ While waiting for availability, keep developing with tools available to you, including locally runnable open-weight models suitable for your hardware and license requirements. They do not provide Claude subscriptions or equivalent model behavior. Keep project instructions, source code, and tests portable so changing tools does not strand your work.
18
+
19
+ Our advocacy priorities are broader regional availability, affordable access, clear eligibility explanations, useful appeal mechanisms, and protection against paying for access that cannot be used. Contributions documenting barriers should omit personal information and distinguish observed failures from inferred causes.
@@ -0,0 +1,40 @@
1
+ # macOS quickstart
2
+
3
+ Last reviewed: October 27, 2026. Source: [official installation guide](https://code.claude.com/docs/en/setup).
4
+
5
+ ## Prepare
6
+
7
+ Confirm eligibility first. The official setup page currently lists macOS 13+ and 4 GB+ RAM, with Intel and Apple Silicon support. Keep your operating system updated. Save your project in a folder you control.
8
+
9
+ ## Install
10
+
11
+ If you already use Homebrew:
12
+
13
+ ```sh
14
+ brew install --cask claude-code
15
+ claude --version
16
+ claude doctor
17
+ ```
18
+
19
+ The official setup page also provides a native installer. Read that page directly before executing its download command. Choose one installation method to make updates easier to understand. Homebrew installations can be updated with `brew upgrade claude-code`.
20
+
21
+ If a native installation is missing from your PATH, consult the official troubleshooting documentation before changing shell files. Do not use `sudo` to repair a user installation blindly.
22
+
23
+ ## Sign in and verify
24
+
25
+ Open Terminal in your project directory and run `claude`. Complete the browser sign-in with the account that owns the subscription. In the interactive session, use `/login` to change accounts and `/status` to inspect the active authentication method.
26
+
27
+ An approved `ANTHROPIC_API_KEY` can select API billing even when you have a subscription. For a subscription session, remove it from the current shell:
28
+
29
+ ```sh
30
+ unset ANTHROPIC_API_KEY
31
+ claude
32
+ ```
33
+
34
+ Then check `/status` again. If it returns after opening a new terminal, review your shell startup files or environment manager locally. Do not paste their contents into a public issue. See [official authentication guidance](https://support.claude.com/en/articles/12304248-manage-api-key-environment-variables-in-claude-code).
35
+
36
+ ## First session
37
+
38
+ Start with a small request such as explaining a function. Review proposed edits and permissions before granting them. Commit your work regularly. Use the account's available model selector rather than assuming every plan always includes every new model.
39
+
40
+ For a graphical workflow, follow the Desktop link from the official setup page. Terminal environment variables and graphical app settings can differ; see the network guide.
@@ -0,0 +1,53 @@
1
+ # Network reliability and the “clean IP” question
2
+
3
+ Last reviewed: October 27, 2026. Technical reference: [official network configuration](https://code.claude.com/docs/en/network-config).
4
+
5
+ ## Define the problem before buying a solution
6
+
7
+ “Clean IP” is a marketing phrase, not a standardized eligibility certificate. An address can have different reputation scores in different databases. Neither those scores nor a residential address establish that Anthropic will accept an account. This project has no verified threshold that predicts suspension or signup success.
8
+
9
+ For ordinary troubleshooting, focus on a connection you trust, correctly configured DNS, valid TLS, and a route you can explain to your network administrator. Public IP geolocation databases can disagree. When your actual eligible location is misclassified, request support review with minimal private evidence rather than treating a vendor's country label as definitive.
10
+
11
+ ## Inspect locally
12
+
13
+ Run `python3 tools/access.py doctor` first. It reports presence of common environment overrides without printing their values. On macOS, you can additionally inspect the system proxy configuration locally:
14
+
15
+ ```sh
16
+ scutil --proxy
17
+ ```
18
+
19
+ Do not publish that raw output: it may reveal internal infrastructure. Browser success does not establish that a terminal process uses the same route. Check which shell and app you launched before changing settings.
20
+
21
+ ## Configure an authorized proxy
22
+
23
+ For a proxy you operate or your organization provides, use its actual HTTP proxy endpoint in the shell that launches Claude Code:
24
+
25
+ ```sh
26
+ # Example only: replace with your authorized proxy endpoint.
27
+ export HTTPS_PROXY=http://127.0.0.1:8080
28
+ claude
29
+ ```
30
+
31
+ Claude Code documents HTTP/HTTPS proxy variables and does not support SOCKS directly. Restart the relevant terminal session after changing its environment. For Desktop sessions, consult the official page's settings-scope rules rather than assuming shell exports reach every app workflow.
32
+
33
+ For an enterprise inspection certificate, ask IT for the authorized CA configuration. Keep TLS validation enabled. Do not install an unknown root certificate supplied by an account reseller.
34
+
35
+ ## Test one symptom at a time
36
+
37
+ Use a request without account credentials to check basic HTTPS behavior:
38
+
39
+ ```sh
40
+ curl -I --connect-timeout 5 --max-time 15 https://claude.ai
41
+ ```
42
+
43
+ This sends your ordinary network metadata, including the connection's source IP, to the destination and any configured proxy. It is optional and is not run by the doctor. An HTTP response establishes only that this request received a response; it does not validate the full login, subscription, API, or streaming path. A 403 alone cannot distinguish account policy from routing or other denials.
44
+
45
+ | Observation | Investigate next |
46
+ | --- | --- |
47
+ | DNS or connection timeout | Local network, captive portal, proxy endpoint, firewall |
48
+ | Certificate error | Clock, certificate chain, authorized corporate inspection |
49
+ | Browser works, terminal fails | Process-specific proxy and certificate configuration |
50
+ | Login succeeds, model request fails | Authentication, entitlement, service status, actual error |
51
+ | Official region restriction | Eligibility and support review |
52
+
53
+ Before paying a network vendor, ask who operates the exit, what traffic is logged, whether TLS is intercepted, how credentials are handled, and what refund terms apply. Avoid sellers claiming guaranteed account safety or asking for Claude cookies. A network purchase cannot promise account eligibility.
@@ -0,0 +1,52 @@
1
+ # Client privacy inspector and scoped launchers
2
+
3
+ Reviewed October 27, 2026. This toolkit borrows the idea of independently inspecting timezone, language, browser identity, and fonts from [Fuck Claude](https://fuck-claude.com/). Its scoring and claims are third-party interpretations, not verified Anthropic enforcement rules. This project does not copy its scoring algorithm or claim that these signals cause a ban.
4
+
5
+ Each client has its own process and network path. A change applied to Terminal does not necessarily affect Desktop or an existing browser. Nothing here changes the macOS system timezone, system language, global proxy settings, the installed Claude apps, or existing browser profiles.
6
+
7
+ ## 1. Claude Code CLI
8
+
9
+ ```sh
10
+ python3 tools/privacy.py audit
11
+ python3 tools/privacy.py cli --timezone UTC --locale en_US.UTF-8
12
+ # Pass CLI arguments after --, for example:
13
+ python3 tools/privacy.py cli --timezone UTC -- --version
14
+ ```
15
+
16
+ The audit reports the current shell's timezone names and whether known locale, routing, and authentication environment variables are set. It does not print their values. Treat even local timezone output as private. It cannot inspect values in Claude settings, other running processes, system proxies, DNS, or server-side checks.
17
+
18
+ The launcher starts `claude` with `TZ`, `LANG`, and `LC_ALL` changed only in the new process and its child processes. Select another installed IANA timezone with `--timezone`, and another available locale with `--locale`. An invalid timezone is rejected. Locale availability and application behavior vary. Inherited endpoint, proxy, and authentication variables are preserved; check `/status` for the actual authentication route. Shell hooks, settings files, plugins and background services may affect behavior. In particular, a previously running Claude Code background supervisor can have its own environment.
19
+
20
+ ## 2. Claude Desktop for macOS
21
+
22
+ ```sh
23
+ python3 tools/privacy.py app --timezone UTC --locale en_US.UTF-8
24
+ # If installed under a different name:
25
+ python3 tools/privacy.py app --app '/Applications/Claude.app'
26
+ ```
27
+
28
+ This asks macOS Launch Services to open a new app instance with the specified environment values. Desktop may read OS preferences directly, reuse existing services, or use app-managed settings instead; these process overrides are an experiment, not a verified masking mechanism. Browser-based sign-in runs in its own browser process. Verify Desktop-specific behavior separately and use [official network settings](https://code.claude.com/docs/en/network-config) for network configuration.
29
+
30
+ ## 3. Claude on the web
31
+
32
+ ```sh
33
+ python3 tools/privacy.py web --browser chrome --timezone UTC --language en-US
34
+ # Or use Microsoft Edge:
35
+ python3 tools/privacy.py web --browser edge --timezone UTC --language en-US
36
+ ```
37
+
38
+ The launcher creates a fresh, private browser data directory and opens `https://claude.ai/` in a separate profile. It prints that path locally. The profile can contain login cookies and other sensitive data; it is not deleted automatically. To reuse it, pass `--profile '/absolute/path/printed/earlier'`. Close the browser before manually deleting a profile you no longer need. Browser launches require the chosen browser to be installed.
39
+
40
+ Open `web/fingerprint.html` in that same browser profile and click **Inspect this browser**. It reports time zone, offset, languages, Intl locale, user agent, platform and a short list of approximate font-width probes. It has no network requests, analytics, WebRTC probes, IP lookup, or persistent storage. Browser, privacy settings, fallbacks and process reuse can change the result. The `--lang` flag is only a requested interface preference; browser `Accept-Language`, `navigator.languages`, and timezone behavior may differ. Verify the actual browser output before relying on it.
41
+
42
+ The browser launcher requests timezone/locale via Launch Services environment variables, but Chromium or macOS may obtain timezone from the OS or an existing service instead. The browser page is the verification mechanism; the launcher does not patch browser APIs or hide installed fonts. Browser extensions, WebRTC, server-side headers, account state, IP reputation and geolocation are outside this page's visibility.
43
+
44
+ ## What these controls can and cannot do
45
+
46
+ | Surface | Controls | Verify | Important blind spots |
47
+ | --- | --- | --- | --- |
48
+ | CLI | Child-process timezone and locale | `audit` in the same environment; app-specific behavior separately | Existing background services, settings, server checks |
49
+ | Desktop | Launch Services environment request | App behavior separately | OS settings, app-managed services, browser sign-in |
50
+ | Web | Dedicated browser profile, language and environment requests | Open local inspector in that profile | Server headers, WebRTC, IP, fonts not covered, browser implementation |
51
+
52
+ These tools do not modify IP addresses, intercept traffic, bypass TLS, spoof account identity, or alter provider rules. A clean local inspection cannot establish access eligibility or account safety. Anthropic's [supported locations](https://support.claude.com/en/articles/8461763-where-can-i-access-claude), [data usage](https://code.claude.com/docs/en/data-usage), and [appeals](https://support.claude.com/en/articles/8241253-safeguards-warnings-and-appeals) are the relevant official references.
@@ -0,0 +1,21 @@
1
+ # Evidence register
2
+
3
+ Reviewed October 27, 2026. Official documentation can change; follow live pages before purchasing or changing account settings.
4
+
5
+ | Topic | Primary source | Used for |
6
+ | --- | --- | --- |
7
+ | Availability | [Where can I access Claude?](https://support.claude.com/en/articles/8461763-where-can-i-access-claude) | Live supported-location list |
8
+ | Installation | [Advanced setup](https://code.claude.com/docs/en/setup) | macOS requirements, install, updates |
9
+ | Subscription access | [Use Claude Code with Pro or Max](https://support.claude.com/en/articles/11145838-use-claude-code-with-your-pro-or-max-plan) | Individual subscription access |
10
+ | Plans | [Pro overview](https://support.claude.com/en/articles/8325606-what-is-the-pro-plan) | Live pricing reference |
11
+ | Billing | [Paid plan billing FAQ](https://support.claude.com/en/articles/8325618-paid-plan-billing-faqs) | Purchase channels and receipts |
12
+ | Cancellation | [Cancel Pro or Max](https://support.claude.com/en/articles/8325617-cancel-your-pro-or-max-subscription) | Timing and purchase-platform management |
13
+ | Authentication | [API key environment variables](https://support.claude.com/en/articles/12304248-manage-api-key-environment-variables-in-claude-code) | Key precedence and billing checks |
14
+ | Networks | [Enterprise network configuration](https://code.claude.com/docs/en/network-config) | Proxy and certificate configuration |
15
+ | Recovery | [Safeguards, warnings, appeals](https://support.claude.com/en/articles/8241253-safeguards-warnings-and-appeals) | Official restriction review |
16
+ | Locked-account billing | [How to get support](https://privacy.claude.com/en/articles/9015913-how-to-get-support) | Cancellation and refund inquiries |
17
+ | Errors | [Installation and authentication troubleshooting](https://support.claude.com/en/articles/14552646-troubleshoot-claude-code-installation-and-authentication) | Callback and entitlement failures |
18
+
19
+ Use three evidence labels in contributions: **Official** for a directly supported vendor statement; **Observed** for a reproducible observation with date and environment; **Unverified** for a hypothesis. Local privacy and account-management recommendations are this project's guidance, not a claim about Anthropic's private risk systems.
20
+
21
+ No IP reputation threshold, residential-IP guarantee, account-warming recipe, or permanent “best model” ranking has been verified by this project. Vendor advertising and affiliate anecdotes are not evidence of guaranteed access.
@@ -0,0 +1,43 @@
1
+ # Subscription playbook
2
+
3
+ Last reviewed: October 27, 2026.
4
+
5
+ ## Choose a billing route
6
+
7
+ Individual [Pro and Max subscriptions include Claude Code](https://support.claude.com/en/articles/11145838-use-claude-code-with-your-pro-or-max-plan). Check current limits and model availability before choosing. A higher tier should solve a demonstrated need; keep a short record of how often limits interrupt useful work.
8
+
9
+ Use the live [Pro overview](https://support.claude.com/en/articles/8325606-what-is-the-pro-plan) and checkout for regional pricing, taxes, and monthly versus annual terms. This repository intentionally does not freeze a global price table.
10
+
11
+ According to the [billing FAQ](https://support.claude.com/en/articles/8325618-paid-plan-billing-faqs), web subscriptions accept credit or debit cards; app-store purchases are managed by that store. Store availability and payment eligibility require their own checks. An iOS purchase is a separate purchase channel, not a special macOS entitlement or a guarantee of regional access.
12
+
13
+ ## Before checkout
14
+
15
+ - Verify current eligibility and your intended account.
16
+ - Check whether an active subscription already exists on the web or in an app store.
17
+ - Use accurate billing information and a payment method you are authorized to use.
18
+ - Review the amount, currency, taxes, renewal frequency, and cancellation route.
19
+ - Keep the receipt privately; do not share it with a reseller or public issue.
20
+
21
+ If a charge is declined, stop repeating attempts. Check the entered details privately, then ask your issuer or the billing provider for the actual failure reason. A decline alone does not prove an IP problem. Do not buy prepaid balances solely on a promise that they will make an ineligible subscription work.
22
+
23
+ ## Keep a private subscription record
24
+
25
+ Store these fields in your own notes, outside this repository:
26
+
27
+ ```text
28
+ Plan: Pro / Max / organization-provided
29
+ Purchase channel: Web / Apple / Google / employer
30
+ Next billing date: YYYY-MM-DD (confirm in provider UI)
31
+ Amount and currency: as displayed on invoice
32
+ Cancellation location: billing provider
33
+ Receipt location: private storage reference
34
+ Last review: YYYY-MM-DD
35
+ ```
36
+
37
+ The record needs no card number, password, token, or full billing address. Review usage and any separately enabled extra charges before each renewal. A Claude subscription and Console/API billing are distinct; confirm your actual billing route with `/status` when using Code.
38
+
39
+ ## Renewals, cancellation, and refunds
40
+
41
+ [Official cancellation instructions](https://support.claude.com/en/articles/8325617-cancel-your-pro-or-max-subscription) say to cancel at least 24 hours before the next billing date to avoid the next charge. Manage cancellation through the purchase platform; paid access normally continues to the end of the current period. Confirm the displayed end date and save the confirmation privately.
42
+
43
+ Use the local reminder tool three or more days ahead to leave time for review. Its date is an estimate you enter, not a live billing lookup. Refunds require a request to the relevant billing provider and are not guaranteed. For a locked account, use [official support](https://privacy.claude.com/en/articles/9015913-how-to-get-support) to ask about cancellation or refund eligibility.
@@ -0,0 +1,22 @@
1
+ # Troubleshooting decision table
2
+
3
+ Use the exact error and the smallest relevant check. Redact screenshots before sharing them.
4
+
5
+ | Symptom | First check | Next action |
6
+ | --- | --- | --- |
7
+ | `claude` not found | Installation method and PATH | Run the official setup checks |
8
+ | Paid account appears free | Signed-in account and provider receipt | Check the purchase channel before buying again |
9
+ | Unexpected API charges | `/status`, API-key presence | Remove an unintended override; review Console billing |
10
+ | Login callback never completes | Local browser/terminal context | Follow the manual authentication flow in official troubleshooting |
11
+ | TLS failure | System clock and authorized CA setup | Ask IT to fix trust configuration |
12
+ | Browser works, CLI times out | Proxy environment in that shell | Compare process configuration privately |
13
+ | Model unavailable | Current entitlement and selected model | Choose an available model or contact your administrator |
14
+ | Usage limit | Account's displayed limit and reset | Wait for reset or evaluate a tier change |
15
+ | Widespread errors | Official status page | Check incident updates before changing local settings |
16
+ | Region unavailable | Official availability list | Request clarification if apparently misclassified |
17
+ | Account disabled | Restriction notice | Use the official appeal and review billing separately |
18
+ | Payment declined | Checkout details and issuer response | Ask issuer/provider; avoid repeated blind retries |
19
+
20
+ References: [installation/authentication troubleshooting](https://support.claude.com/en/articles/14552646-troubleshoot-claude-code-installation-and-authentication), [API-key precedence](https://support.claude.com/en/articles/12304248-manage-api-key-environment-variables-in-claude-code), [service status](https://status.claude.com/), and [appeals](https://support.claude.com/en/articles/8241253-safeguards-warnings-and-appeals).
21
+
22
+ The local doctor does not make network requests or inspect account state. Its successful completion is not a service-health or eligibility result.
package/package.json CHANGED
@@ -1,6 +1,43 @@
1
1
  {
2
2
  "name": "claude-access-for-all",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "description": "A macOS guide and local privacy toolkit for Claude Code, Desktop, and web",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "bin": {
8
+ "claude-access": "bin/claude-access.js"
9
+ },
10
+ "files": [
11
+ "bin/",
12
+ "tools/*.py",
13
+ "web/",
14
+ "docs/",
15
+ "README.md",
16
+ "LICENSE",
17
+ "SECURITY.md"
18
+ ],
19
+ "engines": {
20
+ "node": ">=18"
21
+ },
22
+ "os": [
23
+ "darwin"
24
+ ],
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "git+https://github.com/AMark-CS/claude-access-for-all.git"
28
+ },
29
+ "bugs": {
30
+ "url": "https://github.com/AMark-CS/claude-access-for-all/issues"
31
+ },
32
+ "homepage": "https://github.com/AMark-CS/claude-access-for-all#readme",
33
+ "keywords": [
34
+ "claude",
35
+ "claude-code",
36
+ "macos",
37
+ "privacy",
38
+ "cli"
39
+ ],
40
+ "scripts": {
41
+ "test": "node --test tests/cli.test.js && python3 -m unittest discover -s tests -v && python3 tools/check_docs.py"
42
+ }
43
+ }
@@ -0,0 +1,111 @@
1
+ #!/usr/bin/env python3
2
+ """Offline environment checks and a one-time subscription review calendar."""
3
+ import argparse
4
+ from datetime import date, datetime, timedelta, timezone
5
+ import json
6
+ import os
7
+ import platform
8
+ import shutil
9
+ import sys
10
+ import uuid
11
+
12
+ VARIABLES = (
13
+ 'ANTHROPIC_API_KEY', 'ANTHROPIC_AUTH_TOKEN', 'ANTHROPIC_BASE_URL',
14
+ 'CLAUDE_CODE_USE_BEDROCK', 'CLAUDE_CODE_USE_VERTEX', 'CLAUDE_CODE_USE_FOUNDRY',
15
+ 'HTTP_PROXY', 'HTTPS_PROXY', 'ALL_PROXY', 'NO_PROXY',
16
+ 'http_proxy', 'https_proxy', 'all_proxy', 'no_proxy',
17
+ 'NODE_EXTRA_CA_CERTS', 'NODE_TLS_REJECT_UNAUTHORIZED',
18
+ )
19
+
20
+
21
+ def doctor():
22
+ """Report presence only; never serialize environment values or local paths."""
23
+ present = {name: bool(os.environ.get(name)) for name in VARIABLES}
24
+ warnings = []
25
+ if platform.system() != 'Darwin':
26
+ warnings.append('This guide targets macOS; this machine uses another OS.')
27
+ if not shutil.which('claude'):
28
+ warnings.append('Claude Code is not on PATH. See docs/macos-quickstart.md.')
29
+ if any(present[n] for n in ('ANTHROPIC_API_KEY', 'ANTHROPIC_AUTH_TOKEN', 'ANTHROPIC_BASE_URL')):
30
+ warnings.append('Authentication or endpoint overrides are set. Verify /status before use.')
31
+ if present['ALL_PROXY'] or present['all_proxy']:
32
+ warnings.append('ALL_PROXY is set; do not assume Claude Code uses it. Check the network guide.')
33
+ if present['NODE_TLS_REJECT_UNAUTHORIZED']:
34
+ warnings.append('A TLS validation override is set. Review it privately; keep verification enabled.')
35
+ return {
36
+ 'mode': 'offline; no network requests; no account eligibility check',
37
+ 'system': platform.system(),
38
+ 'macos_version': platform.mac_ver()[0] if platform.system() == 'Darwin' else None,
39
+ 'architecture': platform.machine(),
40
+ 'claude_on_path': bool(shutil.which('claude')),
41
+ 'environment_set': present,
42
+ 'warnings': warnings,
43
+ 'limitations': 'Does not inspect system proxies, Claude settings, credentials, or billing state.',
44
+ }
45
+
46
+
47
+ def parse_date(value):
48
+ try:
49
+ parsed = date.fromisoformat(value)
50
+ if parsed.isoformat() != value:
51
+ raise ValueError
52
+ return parsed
53
+ except ValueError:
54
+ raise argparse.ArgumentTypeError('Use a valid date in YYYY-MM-DD format.')
55
+
56
+
57
+ def days_before(value):
58
+ try:
59
+ number = int(value)
60
+ if not 1 <= number <= 365:
61
+ raise ValueError
62
+ return number
63
+ except ValueError:
64
+ raise argparse.ArgumentTypeError('Choose a whole number from 1 to 365.')
65
+
66
+
67
+ def reminder(renewal, lead, today=None):
68
+ """Generate a bounded ASCII RFC 5545 event; all dates are local calendar dates."""
69
+ today = today or date.today()
70
+ review = renewal - timedelta(days=lead)
71
+ if review < today:
72
+ raise ValueError('Review date is in the past. Choose a later renewal or shorter lead time.')
73
+ end = review + timedelta(days=1)
74
+ lines = [
75
+ 'BEGIN:VCALENDAR', 'VERSION:2.0',
76
+ 'PRODID:-//Claude Access for All//Subscription Review//EN',
77
+ 'CALSCALE:GREGORIAN', 'BEGIN:VEVENT',
78
+ 'UID:' + str(uuid.uuid4()) + '@claude-access-for-all',
79
+ 'DTSTAMP:' + datetime.now(timezone.utc).strftime('%Y%m%dT%H%M%SZ'),
80
+ 'DTSTART;VALUE=DATE:' + review.strftime('%Y%m%d'),
81
+ 'DTEND;VALUE=DATE:' + end.strftime('%Y%m%d'),
82
+ 'SUMMARY:Review Claude subscription renewal',
83
+ 'DESCRIPTION:Check billing provider and renewal date before any charge.',
84
+ 'TRANSP:TRANSPARENT', 'BEGIN:VALARM', 'ACTION:DISPLAY',
85
+ 'TRIGGER;RELATED=START:PT9H',
86
+ 'DESCRIPTION:Review Claude subscription in your billing provider.',
87
+ 'END:VALARM', 'END:VEVENT', 'END:VCALENDAR', '',
88
+ ]
89
+ return '\r\n'.join(lines)
90
+
91
+
92
+ def main():
93
+ parser = argparse.ArgumentParser(description=__doc__)
94
+ commands = parser.add_subparsers(dest='command', required=True)
95
+ commands.add_parser('doctor', help='Print an offline JSON report; values stay private.')
96
+ calendar = commands.add_parser('reminder', help='Print a one-time .ics calendar to stdout.')
97
+ calendar.add_argument('--renewal', type=parse_date, required=True)
98
+ calendar.add_argument('--days-before', type=days_before, default=3)
99
+ args = parser.parse_args()
100
+ if args.command == 'doctor':
101
+ print(json.dumps(doctor(), indent=2))
102
+ else:
103
+ try:
104
+ content = reminder(args.renewal, args.days_before)
105
+ except (ValueError, OverflowError) as exc:
106
+ parser.error(str(exc))
107
+ sys.stdout.buffer.write(content.encode('ascii'))
108
+
109
+
110
+ if __name__ == '__main__':
111
+ main()
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env python3
2
+ """Check repository-local Markdown targets without network access."""
3
+ from pathlib import Path
4
+ import re
5
+ import sys
6
+
7
+ root = Path(__file__).resolve().parents[1]
8
+ errors = []
9
+ for path in root.rglob('*.md'):
10
+ if '.git' in path.parts:
11
+ continue
12
+ content = path.read_text()
13
+ if re.search(r'[\u4e00-\u9fff]', content):
14
+ errors.append(f'{path.relative_to(root)}: expected English documentation')
15
+ for match in re.finditer(r'\[[^\]]*\]\(([^)]+)\)', content):
16
+ target = match.group(1).split('#')[0]
17
+ if not target or '://' in target or target.startswith('mailto:'):
18
+ continue
19
+ if not (path.parent / target).exists():
20
+ errors.append(f'{path.relative_to(root)}: missing target {target}')
21
+ if errors:
22
+ print('\n'.join(errors), file=sys.stderr)
23
+ sys.exit(1)
24
+ print('Local Markdown links and English-documentation checks passed.')
@@ -0,0 +1,121 @@
1
+ #!/usr/bin/env python3
2
+ """Inspect and launch Claude clients with explicit, process-scoped locale settings."""
3
+ import argparse
4
+ import json
5
+ import os
6
+ from pathlib import Path
7
+ import platform
8
+ import re
9
+ import shutil
10
+ import subprocess
11
+ import sys
12
+ import tempfile
13
+ import time
14
+
15
+ ROUTING = ('ANTHROPIC_BASE_URL', 'HTTP_PROXY', 'HTTPS_PROXY', 'ALL_PROXY', 'NO_PROXY',
16
+ 'http_proxy', 'https_proxy', 'all_proxy', 'no_proxy')
17
+ AUTH = ('ANTHROPIC_API_KEY', 'ANTHROPIC_AUTH_TOKEN')
18
+
19
+
20
+ def audit(environ=None):
21
+ env = os.environ if environ is None else environ
22
+ return {
23
+ 'scope': 'This terminal process only; not the browser, Desktop app, or server.',
24
+ 'timezone_override_set': bool(env.get('TZ')),
25
+ 'process_timezone_names': list(time.tzname),
26
+ 'locale_overrides_set': {key: bool(env.get(key)) for key in ('LANG', 'LC_ALL', 'LC_TIME')},
27
+ 'routing_overrides_set': {key: bool(env.get(key)) for key in ROUTING},
28
+ 'credential_overrides_set': {key: bool(env.get(key)) for key in AUTH},
29
+ 'claude_on_path': bool(shutil.which('claude')),
30
+ 'system': platform.system(),
31
+ 'limits': 'No network, IP lookup, application inspection, account check, or ban prediction.',
32
+ }
33
+
34
+
35
+ def scoped_environment(source, timezone, locale):
36
+ env = source.copy()
37
+ env.update({'TZ': timezone, 'LANG': locale, 'LC_ALL': locale})
38
+ return env
39
+
40
+
41
+ def validate_timezone(value):
42
+ if value == 'UTC':
43
+ return value
44
+ if not re.fullmatch(r'[A-Za-z][A-Za-z0-9_+-]*(/[A-Za-z0-9_+.-]+)+', value):
45
+ raise argparse.ArgumentTypeError('Use UTC or an IANA timezone such as Europe/London.')
46
+ path = Path('/usr/share/zoneinfo') / value
47
+ if not path.is_file():
48
+ raise argparse.ArgumentTypeError('Timezone is not present in /usr/share/zoneinfo.')
49
+ return value
50
+
51
+
52
+ def validate_locale(value):
53
+ if not re.fullmatch(r'[A-Za-z0-9_.@-]{1,64}', value):
54
+ raise argparse.ArgumentTypeError('Use a locale such as en_US.UTF-8.')
55
+ return value
56
+
57
+
58
+ def browser_command(browser, profile, language, timezone, locale):
59
+ app = {'chrome': 'Google Chrome', 'edge': 'Microsoft Edge'}[browser]
60
+ return ['/usr/bin/open', '-n', '-a', app, '--env', 'TZ=' + timezone,
61
+ '--env', 'LANG=' + locale, '--env', 'LC_ALL=' + locale, '--args',
62
+ '--user-data-dir=' + str(profile), '--lang=' + language, 'https://claude.ai/']
63
+
64
+
65
+ def main():
66
+ parser = argparse.ArgumentParser(description=__doc__)
67
+ sub = parser.add_subparsers(dest='command', required=True)
68
+ sub.add_parser('audit', help='Show local signal presence without exposing secret values.')
69
+ for name in ('cli', 'app', 'web'):
70
+ command = sub.add_parser(name, help='Launch ' + name + ' with process-scoped settings.')
71
+ command.add_argument('--timezone', type=validate_timezone, default='UTC')
72
+ command.add_argument('--locale', type=validate_locale, default='en_US.UTF-8')
73
+ if name == 'cli':
74
+ command.add_argument('claude_args', nargs=argparse.REMAINDER)
75
+ if name == 'app':
76
+ command.add_argument('--app', default='Claude', help='macOS application name or absolute .app path.')
77
+ if name == 'web':
78
+ command.add_argument('--browser', choices=('chrome', 'edge'), default='chrome')
79
+ command.add_argument('--profile', type=Path, help='Existing dedicated profile directory; omit for a new private directory.')
80
+ command.add_argument('--language', default='en-US', type=validate_locale)
81
+ args = parser.parse_args()
82
+ if args.command == 'audit':
83
+ print(json.dumps(audit(), indent=2))
84
+ return
85
+ if sys.platform != 'darwin':
86
+ parser.error('Launch commands require macOS.')
87
+ env = scoped_environment(os.environ, args.timezone, args.locale)
88
+ if args.command == 'cli':
89
+ executable = shutil.which('claude')
90
+ if not executable:
91
+ parser.error('Claude Code was not found on PATH.')
92
+ extra = args.claude_args
93
+ if extra and extra[0] == '--':
94
+ extra = extra[1:]
95
+ print('Launching Claude Code with process-scoped TZ and locale; see /status for auth.', file=sys.stderr, flush=True)
96
+ os.execve(executable, [executable, *extra], env)
97
+ if args.command == 'app':
98
+ command = ['/usr/bin/open', '-n', '-a', args.app,
99
+ '--env', 'TZ=' + args.timezone, '--env', 'LANG=' + args.locale,
100
+ '--env', 'LC_ALL=' + args.locale]
101
+ print('Launching a new app instance; verify actual app behavior independently.', file=sys.stderr, flush=True)
102
+ else:
103
+ if args.profile:
104
+ profile = args.profile.expanduser().resolve()
105
+ if not profile.is_dir():
106
+ parser.error('The dedicated browser profile directory must already exist.')
107
+ else:
108
+ profile = Path(tempfile.mkdtemp(prefix='claude-access-browser-'))
109
+ command = browser_command(args.browser, profile, args.language, args.timezone, args.locale)
110
+ print('Dedicated browser data directory: ' + str(profile), file=sys.stderr, flush=True)
111
+ print('This directory may contain login data. Keep it private; remove it manually when finished.', file=sys.stderr, flush=True)
112
+ try:
113
+ result = subprocess.run(command, env=env, check=False)
114
+ except OSError as error:
115
+ parser.error(str(error))
116
+ if result.returncode:
117
+ raise SystemExit(result.returncode)
118
+
119
+
120
+ if __name__ == '__main__':
121
+ main()
@@ -0,0 +1 @@
1
+ :root{color-scheme:light;font:16px/1.6 -apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;background:#f7f6f2;color:#202826}body{margin:0}main{max-width:760px;margin:7vh auto;padding:0 24px 64px}.eyebrow{font-size:.72rem;letter-spacing:.13em;color:#526d60;font-weight:700}h1{font-size:clamp(2.4rem,6vw,4rem);line-height:1.05;letter-spacing:-.04em;margin:22px 0}h2{margin-top:32px}.notice{background:#e8eee9;border-left:4px solid #477760;padding:18px}button{border:0;background:#275b46;color:white;border-radius:8px;padding:13px 20px;font-weight:700;font-size:1rem;cursor:pointer}button:focus-visible{outline:3px solid #bb7c34;outline-offset:3px}dl{display:grid;grid-template-columns:minmax(130px,1fr) 2fr;border-top:1px solid #d5ddd7}dt,dd{padding:12px 0;border-bottom:1px solid #d5ddd7;overflow-wrap:anywhere}dt{font-weight:700}dd{margin:0}.foot{color:#58635d;font-size:.88rem}@media(max-width:520px){dl{display:block}dt{border:0;padding-bottom:0}dd{padding-top:4px}}
@@ -0,0 +1,24 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'self'; style-src 'self'; base-uri 'none'; form-action 'none'">
7
+ <title>Claude Access — Browser Signal Inspector</title>
8
+ <link rel="stylesheet" href="fingerprint.css">
9
+ <script src="fingerprint.js" defer></script>
10
+ </head>
11
+ <body>
12
+ <main>
13
+ <p class="eyebrow">CLAUDE ACCESS FOR ALL / LOCAL TOOL</p>
14
+ <h1>Browser signal inspector</h1>
15
+ <p>See what this browser exposes to a local page. Run it in the same browser and profile you use for Claude.</p>
16
+ <p class="notice">This is not a Claude account check or a ban prediction. It makes no network requests and cannot see server-side signals, IP reputation, Desktop app state, or Claude's private rules.</p>
17
+ <button id="scan" type="button">Inspect this browser</button>
18
+ <div id="status" role="status" aria-live="polite"></div>
19
+ <section id="results" hidden><h2>Local results</h2><dl id="signals"></dl>
20
+ <p>Font results are approximate; a blocked or substituted font may look installed. User-agent hints can be absent or reduced. This tool does not query WebRTC, public IP, DNS, or geolocation.</p></section>
21
+ <p class="foot">Values stay in this page. Avoid sharing screenshots of your results.</p>
22
+ </main>
23
+ </body>
24
+ </html>
@@ -0,0 +1,41 @@
1
+ 'use strict';
2
+
3
+ // This local page intentionally performs no fetch, analytics, STUN, or storage.
4
+ function signals() {
5
+ const intl = Intl.DateTimeFormat().resolvedOptions();
6
+ const fonts = ['PingFang SC', 'Microsoft YaHei', 'MiSans', 'HarmonyOS Sans', 'OPPO Sans'];
7
+ const canvas = document.createElement('canvas');
8
+ const ctx = canvas.getContext('2d');
9
+ const sample = '汉字测试ABCwW0123';
10
+ const bases = ['monospace', 'serif', 'sans-serif'];
11
+ const measure = font => { ctx.font = `32px ${font}`; return ctx.measureText(sample).width; };
12
+ const available = ctx ? fonts.filter(name => bases.some(base =>
13
+ measure(`"${name}",${base}`) !== measure(base))) : [];
14
+ return [
15
+ ['Time zone', intl.timeZone || 'Unavailable'],
16
+ ['UTC offset', String(-new Date().getTimezoneOffset() / 60) + ' hours'],
17
+ ['Browser languages', (navigator.languages || [navigator.language]).join(', ') || 'Unavailable'],
18
+ ['Intl locale', intl.locale || 'Unavailable'],
19
+ ['User agent', navigator.userAgent || 'Unavailable'],
20
+ ['Platform', navigator.platform || 'Unavailable'],
21
+ ['Font width probes', ctx ? (available.join(', ') || 'No listed font distinguished from fallbacks') : 'Unavailable'],
22
+ ];
23
+ }
24
+
25
+ document.getElementById('scan').addEventListener('click', () => {
26
+ const list = document.getElementById('signals');
27
+ list.replaceChildren();
28
+ try {
29
+ for (const [name, value] of signals()) {
30
+ const term = document.createElement('dt');
31
+ const description = document.createElement('dd');
32
+ term.textContent = name;
33
+ description.textContent = value;
34
+ list.append(term, description);
35
+ }
36
+ document.getElementById('results').hidden = false;
37
+ document.getElementById('status').textContent = 'Inspection complete. Results are local to this page.';
38
+ } catch (error) {
39
+ document.getElementById('status').textContent = 'Inspection failed in this browser.';
40
+ }
41
+ });