diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2cbc568..82263c6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,12 @@
# Changelog
+## 0.1.1 - 2026-09-01
+
+- Removed the external randomness-service client and its network permission; Random Tools is now entirely local-only.
+- Replaced the remote workspace with bounded local coin, card, sequence, calendar-date, decimal-fraction and spherical-coordinate draws.
+- Added weekday and no-replacement date controls, recipe metadata and expanded cross-browser coverage.
+- Hardened identifier and inclusive-integer bounds, added normalized custom-list identity, and limited screen-reader announcements to concise result status.
+
## 0.1.0 - 2026-09-01
- Added the initial local-first Random Tools workbench.
diff --git a/README.md b/README.md
index 0d1ff91..c80678b 100644
--- a/README.md
+++ b/README.md
@@ -10,9 +10,10 @@ Random Tools is a standalone local-first application in the [add·ideas Toolbox]
- Explicitly non-cryptographic, seeded deterministic generation with reproduction metadata
- Dice expressions, sampling without replacement, Fisher–Yates shuffling and passphrases
- UUIDv4, UUIDv7 and random ULID generation
-- Optional RANDOM.ORG integer requests only after per-session consent
+- Local draws for coin flips, shuffled card deals and unique integer sequences
+- Random calendar dates with weekday and uniqueness controls, exact decimal fractions, and equal-area spherical coordinates
-Secure local generation never falls back to the seeded or remote source. Deterministic results are reproducible but not suitable for secrets. The RANDOM.ORG workspace is the sole network-capable feature: it is not the default, requires an explicit consent checkbox, omits credentials/referrer and may still be unavailable because of browser CORS policy. See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) and [docs/PRIVACY-SECURITY.md](docs/PRIVACY-SECURITY.md).
+All functionality runs locally. Secure generation never falls back to the seeded source, and deterministic results are reproducible but not suitable for secrets. Recipes for custom passphrases identify the normalized list by count and SHA-256 but do not embed it, so reproduction requires the same custom input. The browser CSPRNG is not physical entropy, and no operation is presented as certified for regulated drawings or gambling. See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) and [docs/PRIVACY-SECURITY.md](docs/PRIVACY-SECURITY.md).
## Development
@@ -26,7 +27,7 @@ npm run test:browser
## Release
-`npm run release:artifact` creates a deterministic `release/rand-tools-0.1.0.zip` and checksum sidecar.
+`npm run release:artifact` creates a deterministic `release/rand-tools-0.1.1.zip` and checksum sidecar.
## Licence
diff --git a/SOURCE.md b/SOURCE.md
index ce653bd..43795c7 100644
--- a/SOURCE.md
+++ b/SOURCE.md
@@ -1,7 +1,7 @@
# Corresponding source
-The corresponding source for Random Tools 0.1.0 is available at:
+The corresponding source for Random Tools 0.1.1 is available at:
-https://git.add-ideas.de/lotobo/rand-tools/src/tag/v0.1.0
+https://git.add-ideas.de/lotobo/rand-tools/src/tag/v0.1.1
Build with Node.js 22, npm 11, `npm ci`, and `npm run release:artifact`.
diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md
index d3acdb9..36eb28a 100644
--- a/THIRD_PARTY_NOTICES.md
+++ b/THIRD_PARTY_NOTICES.md
@@ -1,6 +1,6 @@
# Third-party notices
-Random Tools 0.1.0 directly depends on these runtime packages:
+Random Tools 0.1.1 directly depends on these runtime packages:
| Package | Pinned version | Declared licence |
| -------------------------------- | -------------: | ---------------- |
@@ -10,6 +10,4 @@ Random Tools 0.1.0 directly depends on these runtime packages:
| `react` | 19.2.8 | MIT |
| `react-dom` | 19.2.8 | MIT |
-The optional RANDOM.ORG feature calls a public HTTP API after explicit user consent; it does not embed or redistribute RANDOM.ORG code or data. Use of that service remains subject to its operator's terms and availability.
-
This table covers direct production dependencies, not transitive packages or development tooling. During a release build, the exact non-development dependency tree and discovered licence texts are generated from the lockfile into `LICENSES/npm-runtime-licenses.txt` and included in the release ZIP. Copyright and licence terms remain with their respective authors.
diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md
index 8d21d64..296606b 100644
--- a/docs/ARCHITECTURE.md
+++ b/docs/ARCHITECTURE.md
@@ -2,6 +2,6 @@
Random Tools is a static React/Vite application wrapped in the shared Toolbox shell. `random/source.ts` exposes one common interface over two deliberately distinct local sources: browser WebCrypto with rejection-sampled integers, and the versioned `toolbox-helpers` xoshiro128** seeded generator. Secure mode never falls back to deterministic mode.
-`random/generators.ts` builds bounded numbers, strings, identifiers, dice, samples, shuffles, passphrases and normal samples on that interface. Each successful local result includes source identity, parameters and deterministic state where applicable. Operations are synchronous and bounded, so version 0.1 creates no worker.
+`random/generators.ts` builds bounded numbers, strings, identifiers, dice, samples, shuffles, passphrases and normal samples on that interface. `random/draws.ts` adds local binary coin flips, standard playing-card deals, shuffled inclusive integer sequences, Gregorian calendar-date sampling, exact decimal-digit fractions and equal-area points on a spherical surface model. Date sampling can filter weekdays and use a partial Fisher–Yates mapping for selection without replacement; it does not allocate every date in a large range.
-`random/remote.ts` is a separate, explicitly selected RANDOM.ORG integer client. Requests are validated, serialised, credentialless, no-referrer, no-store and subject to a 120-second abort timeout; responses are checked against the requested count/range. This is the only runtime network path and the production CSP permits only that origin in addition to self.
+Each successful result includes source identity, parameters and deterministic state where applicable. Most operations are synchronous and bounded; custom word-list identity uses the asynchronous browser Web Crypto digest API without a worker. Custom lists are trimmed, emptied lines are dropped and uniqueness is checked once before both selection and metadata are derived. The application contains no third-party network client; its CSP limits connections to its own origin for loading the local application shell.
diff --git a/docs/PRIVACY-SECURITY.md b/docs/PRIVACY-SECURITY.md
index de9c475..99e2b5b 100644
--- a/docs/PRIVACY-SECURITY.md
+++ b/docs/PRIVACY-SECURITY.md
@@ -1,7 +1,7 @@
# Privacy and security
-Local WebCrypto is the default. It stays in the browser, has no remote fallback, and is the only mode intended for secrets. Seeded xoshiro128** output is reproducible and explicitly non-cryptographic; anyone with the seed/state/recipe can reproduce or predict it. The entropy estimate for a passphrase is a simple uniform-choice model, not a password-strength audit.
+Local Web Crypto is the default. It stays in the browser, has no network or seeded fallback, and is the only mode intended for secrets. Seeded xoshiro128** output is reproducible and explicitly non-cryptographic; anyone with the seed/state/recipe can reproduce or predict it. The entropy estimate for a passphrase is a simple uniform-choice model, not a password-strength audit.
-The RANDOM.ORG workspace is an opt-in exception to local processing. Only after checking consent and pressing the request button does the browser send the requested count and range to `https://www.random.org`; RANDOM.ORG and network intermediaries can observe the request and the user's IP address. Credentials and referrer are omitted. Browser CORS policy or service limits may prevent the request. No other operation substitutes this source automatically.
+There is no third-party request path, telemetry, analytics, account, geolocation lookup or persistence. Coordinates are generated as mathematical samples and are not derived from the device location. Results and seeds remain in page memory unless copied or downloaded. A custom passphrase recipe contains the normalized list count and a versioned SHA-256 identity, not the list contents; the same normalized input is therefore still required for reproduction.
-Counts, ranges, alphabets, list sizes and generated byte counts have explicit limits before large allocations. Results and seeds remain in page memory unless copied or downloaded. The app has no telemetry, analytics, account or persistence and is not certified for regulated drawings or gambling.
+Counts, ranges, alphabets, list sizes and generated byte counts have explicit limits before large allocations. Web Crypto is a browser-provided CSPRNG, not a physical randomness source. The app is not certified for regulated drawings or gambling.
diff --git a/package-lock.json b/package-lock.json
index 9961426..55fd820 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "rand-tools",
- "version": "0.1.0",
+ "version": "0.1.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "rand-tools",
- "version": "0.1.0",
+ "version": "0.1.1",
"license": "GPL-3.0-or-later",
"dependencies": {
"@add-ideas/toolbox-contract": "0.2.3",
diff --git a/package.json b/package.json
index f2e26e0..2cd7e06 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "rand-tools",
- "version": "0.1.0",
+ "version": "0.1.1",
"description": "Generate secure or reproducible random values locally in the browser.",
"license": "GPL-3.0-or-later",
"author": "Albrecht Degering",
diff --git a/public/CHANGELOG.md b/public/CHANGELOG.md
index 2cbc568..82263c6 100644
--- a/public/CHANGELOG.md
+++ b/public/CHANGELOG.md
@@ -1,5 +1,12 @@
# Changelog
+## 0.1.1 - 2026-09-01
+
+- Removed the external randomness-service client and its network permission; Random Tools is now entirely local-only.
+- Replaced the remote workspace with bounded local coin, card, sequence, calendar-date, decimal-fraction and spherical-coordinate draws.
+- Added weekday and no-replacement date controls, recipe metadata and expanded cross-browser coverage.
+- Hardened identifier and inclusive-integer bounds, added normalized custom-list identity, and limited screen-reader announcements to concise result status.
+
## 0.1.0 - 2026-09-01
- Added the initial local-first Random Tools workbench.
diff --git a/public/README.md b/public/README.md
index 0d1ff91..c80678b 100644
--- a/public/README.md
+++ b/public/README.md
@@ -10,9 +10,10 @@ Random Tools is a standalone local-first application in the [add·ideas Toolbox]
- Explicitly non-cryptographic, seeded deterministic generation with reproduction metadata
- Dice expressions, sampling without replacement, Fisher–Yates shuffling and passphrases
- UUIDv4, UUIDv7 and random ULID generation
-- Optional RANDOM.ORG integer requests only after per-session consent
+- Local draws for coin flips, shuffled card deals and unique integer sequences
+- Random calendar dates with weekday and uniqueness controls, exact decimal fractions, and equal-area spherical coordinates
-Secure local generation never falls back to the seeded or remote source. Deterministic results are reproducible but not suitable for secrets. The RANDOM.ORG workspace is the sole network-capable feature: it is not the default, requires an explicit consent checkbox, omits credentials/referrer and may still be unavailable because of browser CORS policy. See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) and [docs/PRIVACY-SECURITY.md](docs/PRIVACY-SECURITY.md).
+All functionality runs locally. Secure generation never falls back to the seeded source, and deterministic results are reproducible but not suitable for secrets. Recipes for custom passphrases identify the normalized list by count and SHA-256 but do not embed it, so reproduction requires the same custom input. The browser CSPRNG is not physical entropy, and no operation is presented as certified for regulated drawings or gambling. See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) and [docs/PRIVACY-SECURITY.md](docs/PRIVACY-SECURITY.md).
## Development
@@ -26,7 +27,7 @@ npm run test:browser
## Release
-`npm run release:artifact` creates a deterministic `release/rand-tools-0.1.0.zip` and checksum sidecar.
+`npm run release:artifact` creates a deterministic `release/rand-tools-0.1.1.zip` and checksum sidecar.
## Licence
diff --git a/public/SOURCE.md b/public/SOURCE.md
index ce653bd..43795c7 100644
--- a/public/SOURCE.md
+++ b/public/SOURCE.md
@@ -1,7 +1,7 @@
# Corresponding source
-The corresponding source for Random Tools 0.1.0 is available at:
+The corresponding source for Random Tools 0.1.1 is available at:
-https://git.add-ideas.de/lotobo/rand-tools/src/tag/v0.1.0
+https://git.add-ideas.de/lotobo/rand-tools/src/tag/v0.1.1
Build with Node.js 22, npm 11, `npm ci`, and `npm run release:artifact`.
diff --git a/public/THIRD_PARTY_NOTICES.md b/public/THIRD_PARTY_NOTICES.md
index d3acdb9..36eb28a 100644
--- a/public/THIRD_PARTY_NOTICES.md
+++ b/public/THIRD_PARTY_NOTICES.md
@@ -1,6 +1,6 @@
# Third-party notices
-Random Tools 0.1.0 directly depends on these runtime packages:
+Random Tools 0.1.1 directly depends on these runtime packages:
| Package | Pinned version | Declared licence |
| -------------------------------- | -------------: | ---------------- |
@@ -10,6 +10,4 @@ Random Tools 0.1.0 directly depends on these runtime packages:
| `react` | 19.2.8 | MIT |
| `react-dom` | 19.2.8 | MIT |
-The optional RANDOM.ORG feature calls a public HTTP API after explicit user consent; it does not embed or redistribute RANDOM.ORG code or data. Use of that service remains subject to its operator's terms and availability.
-
This table covers direct production dependencies, not transitive packages or development tooling. During a release build, the exact non-development dependency tree and discovered licence texts are generated from the lockfile into `LICENSES/npm-runtime-licenses.txt` and included in the release ZIP. Copyright and licence terms remain with their respective authors.
diff --git a/public/docs/ARCHITECTURE.md b/public/docs/ARCHITECTURE.md
index 8d21d64..296606b 100644
--- a/public/docs/ARCHITECTURE.md
+++ b/public/docs/ARCHITECTURE.md
@@ -2,6 +2,6 @@
Random Tools is a static React/Vite application wrapped in the shared Toolbox shell. `random/source.ts` exposes one common interface over two deliberately distinct local sources: browser WebCrypto with rejection-sampled integers, and the versioned `toolbox-helpers` xoshiro128** seeded generator. Secure mode never falls back to deterministic mode.
-`random/generators.ts` builds bounded numbers, strings, identifiers, dice, samples, shuffles, passphrases and normal samples on that interface. Each successful local result includes source identity, parameters and deterministic state where applicable. Operations are synchronous and bounded, so version 0.1 creates no worker.
+`random/generators.ts` builds bounded numbers, strings, identifiers, dice, samples, shuffles, passphrases and normal samples on that interface. `random/draws.ts` adds local binary coin flips, standard playing-card deals, shuffled inclusive integer sequences, Gregorian calendar-date sampling, exact decimal-digit fractions and equal-area points on a spherical surface model. Date sampling can filter weekdays and use a partial Fisher–Yates mapping for selection without replacement; it does not allocate every date in a large range.
-`random/remote.ts` is a separate, explicitly selected RANDOM.ORG integer client. Requests are validated, serialised, credentialless, no-referrer, no-store and subject to a 120-second abort timeout; responses are checked against the requested count/range. This is the only runtime network path and the production CSP permits only that origin in addition to self.
+Each successful result includes source identity, parameters and deterministic state where applicable. Most operations are synchronous and bounded; custom word-list identity uses the asynchronous browser Web Crypto digest API without a worker. Custom lists are trimmed, emptied lines are dropped and uniqueness is checked once before both selection and metadata are derived. The application contains no third-party network client; its CSP limits connections to its own origin for loading the local application shell.
diff --git a/public/docs/PRIVACY-SECURITY.md b/public/docs/PRIVACY-SECURITY.md
index de9c475..99e2b5b 100644
--- a/public/docs/PRIVACY-SECURITY.md
+++ b/public/docs/PRIVACY-SECURITY.md
@@ -1,7 +1,7 @@
# Privacy and security
-Local WebCrypto is the default. It stays in the browser, has no remote fallback, and is the only mode intended for secrets. Seeded xoshiro128** output is reproducible and explicitly non-cryptographic; anyone with the seed/state/recipe can reproduce or predict it. The entropy estimate for a passphrase is a simple uniform-choice model, not a password-strength audit.
+Local Web Crypto is the default. It stays in the browser, has no network or seeded fallback, and is the only mode intended for secrets. Seeded xoshiro128** output is reproducible and explicitly non-cryptographic; anyone with the seed/state/recipe can reproduce or predict it. The entropy estimate for a passphrase is a simple uniform-choice model, not a password-strength audit.
-The RANDOM.ORG workspace is an opt-in exception to local processing. Only after checking consent and pressing the request button does the browser send the requested count and range to `https://www.random.org`; RANDOM.ORG and network intermediaries can observe the request and the user's IP address. Credentials and referrer are omitted. Browser CORS policy or service limits may prevent the request. No other operation substitutes this source automatically.
+There is no third-party request path, telemetry, analytics, account, geolocation lookup or persistence. Coordinates are generated as mathematical samples and are not derived from the device location. Results and seeds remain in page memory unless copied or downloaded. A custom passphrase recipe contains the normalized list count and a versioned SHA-256 identity, not the list contents; the same normalized input is therefore still required for reproduction.
-Counts, ranges, alphabets, list sizes and generated byte counts have explicit limits before large allocations. Results and seeds remain in page memory unless copied or downloaded. The app has no telemetry, analytics, account or persistence and is not certified for regulated drawings or gambling.
+Counts, ranges, alphabets, list sizes and generated byte counts have explicit limits before large allocations. Web Crypto is a browser-provided CSPRNG, not a physical randomness source. The app is not certified for regulated drawings or gambling.
diff --git a/public/sw.js b/public/sw.js
index 69c18a3..0be2904 100644
--- a/public/sw.js
+++ b/public/sw.js
@@ -1,5 +1,5 @@
const CACHE_PREFIX = "rand-tools-shell-";
-const CACHE_NAME = CACHE_PREFIX + "0.1.0";
+const CACHE_NAME = CACHE_PREFIX + "0.1.1";
const CORE = ["./", "./manifest.webmanifest", "./favicon.svg"];
self.addEventListener("install", (event) => {
event.waitUntil(
diff --git a/public/toolbox-app.json b/public/toolbox-app.json
index e613627..6470807 100644
--- a/public/toolbox-app.json
+++ b/public/toolbox-app.json
@@ -3,12 +3,22 @@
"schemaVersion": 1,
"id": "de.add-ideas.rand-tools",
"name": "Random Tools",
- "version": "0.1.0",
+ "version": "0.1.1",
"description": "Generate secure or reproducible random values locally in the browser.",
"entry": "./",
"icon": "./favicon.svg",
"categories": ["random", "developer", "productivity"],
- "tags": ["random", "uuid", "ulid", "dice", "shuffle", "sample"],
+ "tags": [
+ "random",
+ "uuid",
+ "ulid",
+ "dice",
+ "shuffle",
+ "sample",
+ "cards",
+ "dates",
+ "coordinates"
+ ],
"integration": {
"contextVersion": 1,
"launchModes": ["navigate", "new-tab"],
@@ -22,10 +32,10 @@
"topLevelContext": false
},
"privacy": {
- "processing": "mixed",
+ "processing": "local",
"fileUploads": false,
"telemetry": false,
- "label": "Local generation is the default; RANDOM.ORG is contacted only after explicit opt-in."
+ "label": "All generation runs locally; the application makes no third-party requests."
},
"source": {
"repository": "https://git.add-ideas.de/lotobo/rand-tools",
diff --git a/scripts/serve-test.mjs b/scripts/serve-test.mjs
index b55470a..bf247b5 100644
--- a/scripts/serve-test.mjs
+++ b/scripts/serve-test.mjs
@@ -24,7 +24,7 @@ const types = new Map([
]);
const headers = {
"Content-Security-Policy":
- "default-src 'self'; base-uri 'self'; object-src 'none'; frame-ancestors 'none'; form-action 'self'; script-src 'self' 'wasm-unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; media-src 'self' blob:; connect-src 'self' https://www.random.org; worker-src 'self' blob:; manifest-src 'self'",
+ "default-src 'self'; base-uri 'self'; object-src 'none'; frame-ancestors 'none'; form-action 'self'; script-src 'self' 'wasm-unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; media-src 'self' blob:; connect-src 'self'; worker-src 'self' blob:; manifest-src 'self'",
"Cross-Origin-Opener-Policy": "same-origin",
"Cross-Origin-Resource-Policy": "same-origin",
"Permissions-Policy":
diff --git a/src/components/HelpDialog.tsx b/src/components/HelpDialog.tsx
index 421c815..b77a8f7 100644
--- a/src/components/HelpDialog.tsx
+++ b/src/components/HelpDialog.tsx
@@ -35,9 +35,9 @@ export function HelpDialog({
Generate secure or reproducible random values locally in the browser.
- Local WebCrypto and seeded generation stay in this browser. RANDOM.ORG
- is contacted only from its separate workspace after explicit consent;
- local sources never fall back to it. Inputs and responses are bounded.
+ Web Crypto and seeded generation stay in this browser. The application
+ has no third-party network path, and local sources never fall back to
+ one another. Inputs and outputs are bounded.
}
Reproduction metadata
@@ -109,7 +143,7 @@ function SourceControls({
)}
{mode === "secure"
- ? "Uses crypto.getRandomValues. No fallback to seeded or remote randomness."
+ ? "Uses crypto.getRandomValues locally. There is no network or non-cryptographic fallback."
: "Reproducible pseudorandom output is not cryptographic and must not be used for keys, passwords, or security tokens."}
- This optional action contacts www.random.org,
- revealing your IP address and request parameters to that
- service. Browser JavaScript cannot set the contact-email
- User-Agent requested by its automated-client guidance, so this
- integration cannot claim complete guideline adherence.
-