From 4ce5adf5935e2840f13da9e9de332b4a72357bae Mon Sep 17 00:00:00 2001
From: Matthew Charles Busel
Date: Fri, 25 Sep 2026 17:21:52 -0400
Subject: [PATCH] Visual overhaul: animated hero, terminal captures, Pages
site; fix web UI dropping tokens and spaces
- Fix #3: web UI and --json-stream keep the whitespace between words (carried onto the next token's text and original); tests updated and added
- Web UI: tokens of a fast stream were discarded when [DONE] arrived before the render loop drained; now the queue is flushed first
- Web UI: provider=mock was silently mapped to OpenAI; add Mock (no API key) to the provider menu
- --json-stream no longer prints the human header/footer into its JSONL output
- New --no-open flag for --web
- Mock fixture reads as one sentence and echoes the whole prompt (up to 40 chars) instead of starting mid-sentence
- Terminal header/footer and web UI restyled around one palette; confidence shown as an underline per token
- README: animated SVG hero from real mock output, real terminal captures, collapsible reference; GitHub Pages site in docs/
- Social preview card at .github/social-preview.png
---
.github/social-preview.png | Bin 0 -> 32909 bytes
README.md | 370 +++++++++++++++------------
Screenshot 2025-07-08 185410.png | Bin 48125 -> 0 bytes
Screenshot 2025-07-09 015940.png | Bin 70156 -> 0 bytes
Screenshot 2025-07-12 161852.png | Bin 132129 -> 0 bytes
assets/hero.svg | 12 +
assets/terminal-table.svg | 1 +
assets/terminal-visual.svg | 1 +
assets/web-ui.png | Bin 0 -> 57171 bytes
docs/.nojekyll | 0
docs/assets/hero.svg | 12 +
docs/assets/social-preview.png | Bin 0 -> 32909 bytes
docs/assets/terminal-table.svg | 1 +
docs/assets/terminal-visual.svg | 1 +
docs/assets/web-ui.png | Bin 0 -> 57171 bytes
docs/index.html | 242 ++++++++++++++++++
examples/mock_stream.rs | 6 +-
src/cli.rs | 4 +
src/lib.rs | 201 ++++++++++-----
src/web.rs | 12 +-
static/index.html | 418 +++++++++++++++++--------------
21 files changed, 865 insertions(+), 416 deletions(-)
create mode 100644 .github/social-preview.png
delete mode 100644 Screenshot 2025-07-08 185410.png
delete mode 100644 Screenshot 2025-07-09 015940.png
delete mode 100644 Screenshot 2025-07-12 161852.png
create mode 100644 assets/hero.svg
create mode 100644 assets/terminal-table.svg
create mode 100644 assets/terminal-visual.svg
create mode 100644 assets/web-ui.png
create mode 100644 docs/.nojekyll
create mode 100644 docs/assets/hero.svg
create mode 100644 docs/assets/social-preview.png
create mode 100644 docs/assets/terminal-table.svg
create mode 100644 docs/assets/terminal-visual.svg
create mode 100644 docs/assets/web-ui.png
create mode 100644 docs/index.html
diff --git a/.github/social-preview.png b/.github/social-preview.png
new file mode 100644
index 0000000000000000000000000000000000000000..e824343cf2c034cd85a16a6d9d291c48bd2de726
GIT binary patch
literal 32909
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
+
+
+
+
+
+
+
+
+
+
+ Project site ·
+ Quick start ·
+ Binaries ·
+ API docs
+
A Rust CLI and web UI that intercepts an LLM's token stream as it arrives, shows per-token confidence and perplexity from the logprobs, and can rewrite every other token (or any fraction) on the fly, for interpretability research, red-teaming and prompt engineering.
You normally see a model's answer only as finished text. `every-other-token` sits on the OpenAI or Anthropic SSE stream and lets you watch and poke it token by token: color tokens by confidence, mutate them with transforms (reverse, noise, delete, synonym, chained), compare two providers or two system prompts statistically, record and replay runs, and export per-token data to CSV, JSONL or an HTML heatmap. A `--dry-run` mode with a mock provider needs no API key.
-
+## Try it in one minute (no API key)
+
+```bash
+cargo install every-other-token
+every-other-token "What is consciousness?" --provider mock --visual
+```
+
+
+
+The `mock` provider replays a fixed reply with fixed logprobs through the real interception pipeline, so everything above is real output; only the model is canned. Set `OPENAI_API_KEY` or `ANTHROPIC_API_KEY` and drop `--provider mock` to intercept a real model.
+
+## What you get
+
+**Every token carries its numbers.** Each intercepted token is an event with the original text, what was shown, its index, whether it was rewritten, confidence `exp(logprob)`, perplexity `exp(-logprob)` and the top alternatives. Read them from the library, stream them as JSON lines with `--json-stream`, or export CSV, JSONL or a self-contained HTML heatmap.
+
+
+
+`cargo run --example mock_stream` in a clone of this repo.
+
+**A web UI for watching the stream.** `--web` serves a single page (no build step, no external scripts): single, split and quad views, OpenAI vs Anthropic diff, A/B system prompts, a research dashboard, export, and collaborative rooms where several people edit tokens mid-stream. Pick **Mock (no API key)** in the provider menu to try it offline.
+
+
+
+**Compare, test, record.** Diff two providers (`--diff-terminal`), A/B two system prompts with a Welch's t-test (`--significance`), run headless research batches (`--research --runs 20`), and record any session to replay it after a model update.
## Install
@@ -49,10 +82,11 @@ The Linux binary links the system OpenSSL (libssl3, present on Ubuntu 22.04+ and
| Collaborative rooms | No | Yes: WebSocket multi-participant token surgery |
| TF-IDF semantic heatmaps | No | Yes: no embedding service required |
----
-
## Use cases
+
+Interpretability research, red-teaming, prompt engineering
+
### Interpretability research
- Map which input tokens causally drive each output token using
@@ -87,9 +121,9 @@ The Linux binary links the system OpenSSL (libssl3, present on Ubuntu 22.04+ and
- Export a self-contained HTML heatmap with `AttributionExporter::to_html_heatmap`
to share results without requiring a Python environment.
----
+
-## 5-minute quickstart
+## Build and run from source
### Prerequisites
@@ -152,8 +186,6 @@ export ANTHROPIC_API_KEY="sk-ant-..."
./target/release/every-other-token --completions fish > ~/.config/fish/completions/every-other-token.fish
```
----
-
## Transform types
Each token in the stream can be independently mutated before it reaches the output.
@@ -179,13 +211,94 @@ Each token in the stream can be independently mutated before it reaches the outp
`--min-confidence 0.8` only transforms tokens whose API confidence is below the threshold. High-confidence tokens pass through unchanged.
----
+## A/B system prompt testing
+
+Test how two different system prompts affect per-token confidence distributions, with automatic statistical significance testing.
+
+```bash
+./target/release/every-other-token "Explain machine learning" \
+ --research --runs 30 \
+ --system-a "You are a concise technical expert." \
+ --system-b "You are a friendly tutor explaining to a beginner." \
+ --significance \
+ --output ab_results.json
+```
+
+The output JSON includes:
+- Per-run confidence histograms for system A and system B
+- Welch's t-test statistic and p-value
+- Mean confidence delta between the two system prompts
+- Positions where the distributions diverged most
+
+### A/B via the web UI
+
+Launch with `--web` and select the **Experiment** view to see both system prompts streaming side-by-side with a live divergence map.
+
+## Web UI guide
+
+Launch with `--web` to open the single-page application at `http://localhost:8888`.
+
+| View | Description |
+|------|-------------|
+| **Single** | Live token stream with per-token confidence bars and perplexity pulse |
+| **Split** | Original vs transformed output side by side |
+| **Quad** | Four transforms applied simultaneously in a 2x2 grid |
+| **Diff** | OpenAI and Anthropic streaming the same prompt; diverging positions highlighted |
+| **Experiment** | A/B mode: two system prompts, live divergence map |
+| **Research** | Aggregate stats dashboard: perplexity histogram, confidence distribution, vocabulary diversity |
+
+Change the port with `--port 9000` (also settable in `~/.eot.toml`); `--no-open` skips opening a browser tab. With no API key, run `every-other-token --web --provider mock` or pick **Mock (no API key)** in the provider menu.
+
+## Configuration file
+
+Create `~/.eot.toml` (global) or `.eot.toml` in the working directory (local wins over global):
+
+```toml
+provider = "anthropic"
+model = "claude-sonnet-4-6"
+transform = "reverse"
+rate = 0.5
+port = 8888
+top_logprobs = 5
+system_a = "You are a concise assistant."
+```
+
+All CLI flags override config file values.
+
+## Building from source
+
+```bash
+git clone https://github.com/Mattbusel/Every-Other-Token
+cd Every-Other-Token
+cargo build --release
+cargo test --lib
+```
+
+Enable optional features:
+
+```bash
+cargo build --release --features sqlite-log,self-tune
+```
+
+## Contributing
+
+1. Fork the repository.
+2. Create a feature branch: `git checkout -b my-feature`.
+3. Ensure `cargo fmt`, `cargo clippy -- -D warnings`, and `cargo test --lib` all pass.
+4. Open a pull request against `main`.
+
+CI enforces formatting, Clippy, the full test suite, and a release build before merging.
+
+## Reference
-## Token attribution export
+The library behind the CLI, module by module. Each section is collapsed; open the one you need.
+
+
+Token attribution export
`attribution::AttributionExporter` exports per-token confidence, perplexity, and attribution scores to three formats compatible with LIME, Captum, and custom dashboards.
-### Data types
+#### Data types
| Type | Description |
|------|-------------|
@@ -193,7 +306,7 @@ Each token in the stream can be independently mutated before it reaches the outp
| `SequenceAttribution` | Full sequence: all tokens + aggregate confidence, aggregate perplexity, semantic drift |
| `AttributionExporter` | Serializes to JSONL, CSV, or self-contained HTML heatmap |
-### Export to JSONL (LIME / Captum compatible)
+#### Export to JSONL (LIME / Captum compatible)
```rust
use every_other_token::attribution::{AttributionExporter, SequenceAttribution, TokenAttribution};
@@ -230,7 +343,7 @@ let html = exporter.to_html_heatmap(&seq);
std::fs::write("heatmap.html", html).unwrap();
```
-### Semantic drift detection
+#### Semantic drift detection
Semantic drift measures the confidence decay from the first half of the generated sequence to the second half. A positive value means the model became less certain toward the end of the response.
@@ -241,7 +354,7 @@ if drift > 0.15 {
}
```
-### Finding the most and least confident tokens
+#### Finding the most and least confident tokens
```rust
let (most_confident, least_confident) = exporter.confidence_extremes(&seq);
@@ -249,7 +362,7 @@ println!("Most confident positions: {:?}", most_confident);
println!("Least confident positions: {:?}", least_confident);
```
-### Python interoperability
+#### Python interoperability
The JSONL format maps directly to a pandas DataFrame:
@@ -273,16 +386,17 @@ with open("attribution.jsonl") as f:
df = pd.DataFrame(rows)
```
----
+
-## Token Attribution Map (causal leave-one-out)
+
+Token Attribution Map (causal leave-one-out)
`AttributionMap` computes per-output-token causal attribution scores using an
approximate leave-one-out (LOO) proxy. For each input token *i*, the model is
re-run with token *i* masked; the drop in confidence of each output token is
recorded as the influence score.
-### Computation model
+#### Computation model
```
score(input_i, output_j) = baseline_confidence(output_j)
@@ -295,7 +409,7 @@ Negative score = input *i* was **hurting** output *j*.
This requires N+1 inferences for N input tokens. Use `max_input_tokens` in your
runner to control cost.
-### Example
+#### Example
```rust
use every_other_token::attribution::{AttributionMap, AttributionRenderer};
@@ -321,7 +435,7 @@ let json = map.to_json().expect("serialization succeeds");
std::fs::write("attribution_map.json", json).ok();
```
-### Terminal renderer
+#### Terminal renderer
`AttributionRenderer` uses ANSI color bands matching the existing heatmap:
@@ -335,15 +449,16 @@ std::fs::write("attribution_map.json", json).ok();
`with_top_k(N)` limits the display to the N most influential input tokens per
output position.
----
+
-## Prompt Mutation Lab
+
+Prompt Mutation Lab
`MutationLab` systematically varies specified tokens, phrases, or parameters in
a base prompt, runs all variants through the model, and produces a ranked
markdown table of results.
-### Mutation targets
+#### Mutation targets
| Target | Description |
|--------|-------------|
@@ -352,7 +467,7 @@ markdown table of results.
| `SystemPrompt` | Replace the entire system prompt |
| `Temperature` | Vary the sampling temperature (variant parsed as `f32`) |
-### Mutation metrics
+#### Mutation metrics
| Metric | Description |
|--------|-------------|
@@ -361,7 +476,7 @@ markdown table of results.
| `TopTokenChange` | Whether any top predicted token changed vs. the baseline |
| `SentimentShift` | Fraction of high-confidence tokens minus baseline fraction |
-### Example
+#### Example
```rust
use every_other_token::mutation_lab::{
@@ -392,10 +507,14 @@ println!("Best variant: {:?}", result.best().map(|r| &r.variant));
println!("Worst variant: {:?}", result.worst().map(|r| &r.variant));
```
-### Output table format
+#### Output table format
```markdown
-## Mutation Experiment Results
+
+
+
+
+Mutation Experiment Results
**Base prompt:** `Explain {SLOT} to a 5-year-old.`
**Target:** Word(1)
@@ -409,69 +528,10 @@ println!("Worst variant: {:?}", result.worst().map(|r| &r.variant));
| 4 | `photosynthesis` | `Explain photosynthesis to a 5-y...` | 7.2981 |
```
----
+
-## A/B system prompt testing
-
-Test how two different system prompts affect per-token confidence distributions, with automatic statistical significance testing.
-
-```bash
-./target/release/every-other-token "Explain machine learning" \
- --research --runs 30 \
- --system-a "You are a concise technical expert." \
- --system-b "You are a friendly tutor explaining to a beginner." \
- --significance \
- --output ab_results.json
-```
-
-The output JSON includes:
-- Per-run confidence histograms for system A and system B
-- Welch's t-test statistic and p-value
-- Mean confidence delta between the two system prompts
-- Positions where the distributions diverged most
-
-### A/B via the web UI
-
-Launch with `--web` and select the **Experiment** view to see both system prompts streaming side-by-side with a live divergence map.
-
----
-
-## Web UI guide
-
-Launch with `--web` to open the single-page application at `http://localhost:8888`.
-
-| View | Description |
-|------|-------------|
-| **Single** | Live token stream with per-token confidence bars and perplexity pulse |
-| **Split** | Original vs transformed output side by side |
-| **Quad** | Four transforms applied simultaneously in a 2x2 grid |
-| **Diff** | OpenAI and Anthropic streaming the same prompt; diverging positions highlighted |
-| **Experiment** | A/B mode: two system prompts, live divergence map |
-| **Research** | Aggregate stats dashboard: perplexity histogram, confidence distribution, vocabulary diversity |
-
-Change the port with `--port 9000`. The port can also be set in `~/.eot.toml`.
-
----
-
-## Configuration file
-
-Create `~/.eot.toml` (global) or `.eot.toml` in the working directory (local wins over global):
-
-```toml
-provider = "anthropic"
-model = "claude-sonnet-4-6"
-transform = "reverse"
-rate = 0.5
-port = 8888
-top_logprobs = 5
-system_a = "You are a concise assistant."
-```
-
-All CLI flags override config file values.
-
----
-
-## CLI reference
+
+CLI reference
```
USAGE:
@@ -488,6 +548,7 @@ OPTIONS:
--heatmap Enable token importance heatmap
--web Launch web UI instead of terminal
--port Web UI port [default: 8888]
+ --no-open With --web, do not open a browser tab
--research Headless research mode
--runs Number of research runs [default: 10]
--output Research output JSON path [default: research_output.json]
@@ -510,13 +571,14 @@ OPTIONS:
--log-db SQLite experiment log (requires sqlite-log feature)
```
----
+
-## Divergence Detection Engine
+
+Divergence Detection Engine
`divergence.rs` runs the same prompt through N model configurations simultaneously and computes a per-position **Jensen-Shannon divergence** score showing exactly where and how much models disagree.
-### Concepts
+#### Concepts
| Term | Description |
|------|-------------|
@@ -526,7 +588,7 @@ OPTIONS:
| `DivergenceResult` | Complete run: all streams, all divergence points, aggregate statistics |
| `DivergenceDetector` | Orchestrates analysis; threshold configurable |
-### Jensen-Shannon divergence
+#### Jensen-Shannon divergence
At each token position `t`, the detector collects a probability distribution `P_i(t)` from each model (from the logprobs API). It then computes:
@@ -543,7 +605,7 @@ normalised by `log(n)` to give a score in `[0, 1]`.
| ~0.5 | Substantial disagreement |
| 1.0 | Models produce completely different tokens |
-### Usage
+#### Usage
```rust
use every_other_token::divergence::{DivergenceDetector, ModelConfig};
@@ -565,7 +627,7 @@ println!("Mean JS: {:.4}", result.mean_divergence());
println!("High-divergence positions: {:?}", result.high_divergence_positions(0.5));
```
-### Coloured diff report
+#### Coloured diff report
`DivergenceResult::render_report()` produces a multi-line ANSI report:
@@ -575,13 +637,14 @@ println!("High-divergence positions: {:?}", result.high_divergence_positions(0.5
Each model's full token stream is printed with its disagreement positions highlighted.
----
+
-## Token Intervention Mode
+
+Token Intervention Mode
`intervention.rs` enables **causal interventions**: pausing generation at any token, injecting a correction, continuing generation from the injected token, and measuring the causal effect downstream.
-### Concepts
+#### Concepts
| Term | Description |
|------|-------------|
@@ -591,7 +654,7 @@ Each model's full token stream is printed with its disagreement positions highli
| `causal_effect()` | Normalised token-level edit distance between original and final streams |
| `causal_influence_map()` | Per-position influence score: how much each position affects downstream tokens |
-### Causal effect measurement
+#### Causal effect measurement
```rust
use every_other_token::intervention::{InterventionHistory, Intervention};
@@ -609,7 +672,7 @@ history.apply(intervention, counterfactual);
println!("Causal effect: {:.3}", history.causal_effect()); // fraction of tokens that changed
```
-### TUI token editor
+#### TUI token editor
`TokenEditor` provides cursor navigation and token-level editing in any VT100 terminal:
@@ -627,7 +690,7 @@ let edit = editor.commit_edit(); // Some((1, " sky", " ocean"))
println!("{}", editor.render()); // ANSI-highlighted stream
```
-### Causal influence map
+#### Causal influence map
```rust
use every_other_token::intervention::causal_influence_map;
@@ -640,9 +703,10 @@ let map = causal_influence_map(&original, &counterfact);
// map[1] = fraction of positions >1 that changed = 0.0 (c and d unchanged)
```
----
+
-## Key modules
+
+Key modules
| Module | Responsibility |
|--------|----------------|
@@ -669,9 +733,10 @@ let map = causal_influence_map(&original, &counterfact);
| `bayesian.rs` | Bayesian confidence interval estimation across runs |
| `checkpoint.rs` | Snapshot/restore for long research sessions |
----
+
-## Feature flags
+
+Feature flags
| Flag | Default | Description |
|------|---------|-------------|
@@ -685,13 +750,14 @@ let map = causal_influence_map(&original, &counterfact);
| `redis-backing` | Off | Write-through Redis persistence for agent memory and snapshots |
| `wasm` | Off | WASM target bindings via `wasm-bindgen` |
----
+
-## Semantic Similarity
+
+Semantic Similarity
`src/similarity.rs` provides TF-IDF based semantic similarity scoring.
-### CLI usage
+#### CLI usage
```bash
# Compare two texts
@@ -701,7 +767,7 @@ every-other-token --similarity "the quick brown fox" "a fast red fox"
every-other-token "$(cat my_prompts.txt)" --diversity-filter
```
-### Programmatic usage
+#### Programmatic usage
```rust
use every_other_token::similarity::{SemanticScorer, DiversityFilter};
@@ -723,7 +789,10 @@ let filter = DiversityFilter::new(&seqs);
let deduped = filter.filter(seqs, 0.85);
```
-## Streaming with Backpressure
+
+
+
+Streaming with Backpressure
`src/stream_compress.rs` provides a streaming token compressor with three
backpressure strategies.
@@ -734,7 +803,7 @@ backpressure strategies.
| `Block` | Signals `Throttled` until the buffer drains below `low_watermark` |
| `Compress` | Aggressively compresses incoming tokens (keeps every other) |
-### Example
+#### Example
```rust
use every_other_token::stream_compress::{
@@ -755,41 +824,14 @@ let stats = sc.stats();
println!("ratio: {:.2}", stats.ratio);
```
----
+
-## Building from source
-
-```bash
-git clone https://github.com/Mattbusel/Every-Other-Token
-cd Every-Other-Token
-cargo build --release
-cargo test --lib
-```
-
-Enable optional features:
-
-```bash
-cargo build --release --features sqlite-log,self-tune
-```
-
----
-
-## Contributing
-
-1. Fork the repository.
-2. Create a feature branch: `git checkout -b my-feature`.
-3. Ensure `cargo fmt`, `cargo clippy -- -D warnings`, and `cargo test --lib` all pass.
-4. Open a pull request against `main`.
-
-CI enforces formatting, Clippy, the full test suite, and a release build before merging.
-
----
-
-## Batch Processing
+
+Batch Processing
The `batch` module (`src/batch.rs`) provides a priority-queue-based concurrent pipeline for compressing many token sequences at once.
-### Data types
+#### Data types
| Type | Description |
|------|-------------|
@@ -798,7 +840,7 @@ The `batch` module (`src/batch.rs`) provides a priority-queue-based concurrent p
| `BatchConfig` | `max_concurrent`, `queue_capacity`, `timeout` |
| `BatchStats` | Aggregate: `jobs_submitted`, `jobs_completed`, `jobs_failed`, `avg_ratio`, `throughput_tokens_per_sec` |
-### Usage
+#### Usage
```bash
# Process a JSONL file where each line is a JSON array of tokens
@@ -813,7 +855,7 @@ Each line of `tokens.jsonl` should be a JSON array:
Results are streamed to stdout as JSONL. Aggregate stats are printed to stderr.
-### API example
+#### API example
```rust
use every_other_token::batch::{BatchConfig, BatchProcessor};
@@ -831,13 +873,14 @@ while let Some(result) = stream.next().await {
Higher-priority jobs are processed first via a `BinaryHeap`. Concurrent execution is bounded by `max_concurrent`.
----
+
-## Quality-Adaptive Compression
+
+Quality-Adaptive Compression
The `adaptive` module (`src/adaptive.rs`) measures and optimises the quality of token-level compression.
-### Quality model
+#### Quality model
```
overall_score = 0.4 * semantic_preservation
@@ -852,14 +895,14 @@ overall_score = 0.4 * semantic_preservation
| `ratio` | `compressed_len / original_len`, lower means more compressed |
| `overall_score` | Weighted combination (higher is better) |
-### Usage
+#### Usage
```bash
# Print quality metrics for the compression applied to a prompt
every-other-token "The quick brown fox jumps" --quality
```
-### API example
+#### API example
```rust
use every_other_token::adaptive::{AdaptiveCompressor, CompressionTarget, QualityMetric};
@@ -879,9 +922,10 @@ let (compressed, quality) = compressor.compress(&tokens, &target);
println!("compressed to {} tokens with score={:.3}", compressed.len(), quality.overall_score);
```
----
+
-## Context Window Manager
+
+Context Window Manager
The `context` module provides `ContextWindow`, a priority-based token budget manager for LLM context construction.
@@ -925,9 +969,10 @@ println!("evictions: {}", stats.evictions);
- `ContextStats` tracks block counts by type, utilization, and eviction count
- `--context-budget ` CLI flag sets the token budget (default: 4096)
----
+
-## Vocabulary Analyzer
+
+Vocabulary Analyzer
The `vocab` module provides `VocabularyAnalyzer`, measures vocabulary coverage, OOV rates, and Zipf's law fit for token sequences.
@@ -970,18 +1015,15 @@ println!("Zipf exponent: {:.3} (r²={:.3})", params.exponent, params.r_squared);
- `zipf_score`: 1 - |exponent - 1.0|, normalized to [0, 1]
- `--vocab-stats` CLI flag: prints vocabulary statistics for the current prompt
----
+
## Status
-Research tool, actively developed. The CI workflow is currently failing on `main`; `cargo build` works. The screenshot above is from an early interactive version; the current CLI takes the prompt, transform and model as arguments (see the CLI reference).
-
----
+Research tool, actively developed. CI (the full test suite plus a feature-flag matrix) runs on every push and pull request. Tagged releases get prebuilt binaries for Linux, macOS and Windows from the release workflow.
## License
-MIT -- see [LICENSE](LICENSE) for details.
-
+MIT, see [LICENSE](LICENSE) for details.
## Hire the author
diff --git a/Screenshot 2025-07-08 185410.png b/Screenshot 2025-07-08 185410.png
deleted file mode 100644
index 83aa8fc4ce204ec623153f7a7578fdaa3b02f585..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 48125
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
yc00)VgGUIzQ<+Q$Zy-{1ZHa$cfKX
zo?7NU003>rpFffwkK(5Q0HNT4y6VF~t8H9}@70NHvC#08$a?i|YbtV0uQd8d8_il>FPr-!Z(jChtXF_S?=$vmn%CY?MubQS(
zGz3*D`bf{&+4(Cij|$DBpp84D;Gvk|2li&3KNaPC18>cT6?GnDPw2Ns=K5$VZN>a`
z3DpUZ&ux1heWtLGIlVNfFws<)yofSwiT(Km))}v+D4`T=LeSRU03zGcf;K;xdWInx
zg-$2JH8z9^WNTr&z6$HBx8KdvWPw8{>FejXSi2O`>cZLWwZCgkc+(KPZwgRuS1rdA
zfVwUC`l|BZY75^+{bbu(vhBA6&|%w1+^IOaiSXQqtj;DFacyAEN31*RsDMySmYO^>
zLs4X@{qies1ZxJ5lAA7B1?>t_$Hom0tKW_GecY2}$Bqa(VAl1>DcbJIRFMkD